🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1142閲覧

データ件数が10~20程度の計算量なのに何故か実行に8秒くらいかかってしまう。

yoshiki_iwasa

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/03/01 02:00

編集2021/03/01 04:39

#質問概要
現在、Python の docxとopenpyxlを使って、wordファイルの情報をexcel に変換するプログラムを書いています。
データの件数は10 ~ 20程度なのに、なぜか実行時間が8s くらいかかってしまいます。どこがボトルネックになっているかわかりません(T _ T)

#質問詳細
環境
macOS Catalina 10.15.6
機種名: MacBook Air
機種ID: MacBookAir8,2
プロセッサ名: Dual-Core Intel Core i5
プロセッサ速度: 1.6 GHz
プロセッサの個数: 1
コアの総数: 2
二次キャッシュ(コア単位): 256 KB
三次キャッシュ: 4 MB
ハイパー・スレッディング・テクノロジ: 有効
メモリ: 8 GB

現在書いているプログラムは、以下のような形式のwordファイルがあった時、それをexcelファイルに見やすく変換するものです

wordファイルの形式

Word

1test:試験 2apple:りんご 3orange:オレンジ 4challenge:挑戦 5happy:幸せ 6cat:猫 7dog:犬 8bus:バス 9car:車 10fight:戦い 11sea:海

変換後!
excelファイルの画像

この単純な実行におよそ8sかかってしまいます。
ボトルネックになっている関数を特定することはできたのですが(xlsx_export()関数)、さらにその中のどこがボトルネックなのかわかりません。。。。

ソースファイルは以下です。

Python

1import docx 2import openpyxl 3import glob 4import spacy 5from openpyxl.styles.fonts import Font 6from openpyxl.styles.borders import Border, Side 7from openpyxl.styles import PatternFill 8 9def init_file(ws): 10 ws['A1'] = 'No.' 11 ws['A1'].font = Font(name = 'MS P明朝', size=15) 12 ws['A1'].fill = PatternFill(patternType='solid',fgColor='D1FE7B',bgColor='D1FE7B') 13 ws['B1'] = '単語' 14 ws['B1'].font = Font(name = 'MS P明朝', size=15) 15 ws['B1'].fill = PatternFill(patternType='solid',fgColor='D1FE7B',bgColor='D1FE7B') 16 ws['C1'] = '意味' 17 ws['C1'].font = Font(name = 'MS P明朝', size=15) 18 ws['C1'].fill = PatternFill(patternType='solid',fgColor='D1FE7B',bgColor='D1FE7B') 19 ws['D1'] = '品詞' 20 ws['D1'].font = Font(name = 'MS P明朝', size=15) 21 ws['D1'].fill = PatternFill(patternType='solid',fgColor='D1FE7B',bgColor='D1FE7B') 22 23#こいつがボトルネック 24def xlsx_export(word_list, wb): 25 26 analy = spacy.load('fr_core_news_sm') #解析ツール 27 wb.remove(wb.worksheets[0]) #シートのしゅとく 28 wb.create_sheet("WordList") 29 ws = wb.worksheets[0] 30 init_file(ws) 31 32 number = 'A' 33 french = 'B' 34 japan = 'C' 35 pops = 'D' 36 row = 2 37 num = 1 38 alpha = '' 39 for lst in word_list: 40 k = lst[0] 41 v = lst[1] 42 k = k.lower() 43 if k[0] != alpha: 44 ws[number + str(row)] = k[0].upper() 45 ws[number + str(row)].font = Font(name = 'ヒラギノ明朝 Pro' ,size=15, italic=True) 46 ws[french + str(row)].fill = PatternFill(patternType='solid',fgColor='d3d3d3',bgColor='d3d3d3') 47 ws[japan + str(row)].fill = PatternFill(patternType='solid',fgColor='d3d3d3',bgColor='d3d3d3') 48 ws[number + str(row)].fill = PatternFill(patternType='solid',fgColor='d3d3d3',bgColor='d3d3d3') 49 ws[pops + str(row)].fill = PatternFill(patternType='solid',fgColor='d3d3d3',bgColor='d3d3d3') 50 alpha=k[0] 51 row += 1 52 f_cell = french + str(row) 53 j_cell = japan + str(row) 54 n_cell = number + str(row) 55 p_cell = pops + str(row) 56 ws[n_cell] = num 57 ws[f_cell] = k 58 ws[j_cell] = v 59 ws[p_cell] = analy(k)[0].pos_ 60 ws[n_cell].font = Font(size = 15) 61 ws[f_cell].font = Font(name = 'ヒラギノ明朝 Pro' ,size=15, italic=True) 62 ws[j_cell].font = Font(name = 'HGS明朝E', size=15) 63 ws[p_cell].font = Font(name = 'HGS明朝E', size=15) 64 row += 1 65 num += 1 66 wb.save("test.xlsx") 67#----------------------------------------------------- 68#以下、main関数に相当 69 70doc = docx.Document("/Users/iwasayoshiki/Desktop/Test_word.docx")#wordファイルのpath 71 72 73row_list = doc.paragraphs 74 75dic = {} 76for row in row_list: 77 if row.text != '': 78 test = row.text.split(':') 79 key = str(test[0]).lower() 80 value = str(test[1]) 81 if (dic.get(key) != None): 82 dic[key] += (", " + value) 83 else: 84 dic[key] = value 85words = sorted(dic.items()) 86 87is_exist = glob.glob('/Users/iwasayoshiki/takumi/test.xlsx', recursive=True) 88if len(is_exist) == 0: 89 wb = openpyxl.Workbook() 90else: 91 wb = openpyxl.load_workbook('/Users/iwasayoshiki/takumi/test.xlsx') 92 93 94 95xlsx_export(words, wb) # ここの関数がボトルネックになっている 96 97wb.close() 98

自然言語処理のせいかなとも思ったのですが、そこを外しても実行時間が変わりんませんでした。Python初心者なので、まだ自分がしらない仕様などのせいでこうなっているのでしょうか... お力お貸しください。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/03/01 04:03

> 計算量はO(10 ~ 20) ?? 「データ件数が10~20」の間違いでしょうか?
yoshiki_iwasa

2021/03/01 04:37

あ、そうです そういう意味です!!
bsdfan

2021/03/01 10:42

フォントや色などのスタイルの設定が重いのではないかという気がします。 その辺のをコメントアウトして試すとどうでしょうか?
yoshiki_iwasa

2021/03/01 11:16

フォントの部分をコメントアウトしてもかわりませんでした、、 liner_profile をつかってやってみてます
bsdfan

2021/03/01 11:49

変化なかったですか。 でも、ループの中でセル毎にFont等を毎回作成するよりは、先頭など一ヶ所で変数にセットして、それを使い回す方がいいです。(変更などのメンテナンスも楽です)。
guest

回答1

0

line_profilerを使ってどこがボトルネックになっているか探してみてはいかがでしょうか?

%lprun -f xlsx_export xlsx_export(words, wb)

https://qiita.com/hmj-kd/items/8767e5268793202e6725

投稿2021/03/01 02:53

37458

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問