#質問概要
現在、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初心者なので、まだ自分がしらない仕様などのせいでこうなっているのでしょうか... お力お貸しください。。。