python実行のわりに大きいexcelファイルのopenpyxl遅い問題を解決します。


余計なことを言わないで、コードを見てください。
talk is cheap

  from openpyxl import Workbook
  from openpyxl.utils import get_column_letter
  from openpyxl import load_workbook
  import time
  wb = load_workbook("E:/a.xlsx", read_only=True)
  sh = wb["Sheet"]
  # rowItem = {}
  # for j in range(1,2000):
  #   for i in range(1, 30):
  #     rowItem[get_column_letter(i)] = i
  #   sh.append(rowItem)
  # wb.save("E:/a.xlsx")
  t0 = time.time()
  print(sh['V500'].value)
  t1 = time.time()
  print("openpyxl    :", str(t1-t0))

  import xlrd
  xlsPath = "E:/a.xlsx"
  WorkBook = xlrd.open_workbook(xlsPath)
  sh = WorkBook.sheet_by_name("Sheet")

  t0 = time.time()
  print(sh.cell(499,22).value)
  t1 = time.time()
  print("xlrd    :", str(t1-t0))
テスト結果:

22
openpyxl    : 0.44217610359191895
23.0
xlrd    : 0.0010063648223876953
結論
openpyxlの遅いのは読み取りが遅いので、xlrdを選択して代用できます。詳細テストは以下に続きます。
直接にxlwt+xlrdを使わないのはxlwtが2003と以下のバージョンだけを支持するためで、最大の行数は65536で制限して、足りないで、openpyxlは大体100万元になります。
主な話は終わりました。次の詳細に言いました。ツールを書く時に発生したこの問題は最初に使ったxlwt+xldで、行数が基準を超えました。openpyxlに変えられません。excel 2007のバージョンを使って、三万行のデータはテストできませんでした。三四秒で、openpyxlに変えたら、何分間かかりましたか?そして関数の運転時間のモニターをつけてから、読み取り時に発生した問題を見ました。
原因を推測する:
推測すると、openpyxlは行番号列番号によって読み取られた時、最初の行の最初の列から巡回します。行番号が指定行番号に等しいまで、列番号が指定列番号に等しいので、読み込む行番号が多ければ多いほど遅くなります。下の表示によって直接にメモリの中の住所に対応する元素を探せばいいです。だから、エクセルの総量がいくらであろうと、速度は基本的に変わらないです。
残した穴
xlwt書き込みは65536行しかサポートされていません。xlrdの読み取りも可能です。つまり、これ以上のデータを使ってもエラーが発生する可能性があります。
私はここで多表のデータを読んで単表のデータを生成しますので、生成方式は大体Na*Nbです。だから、実際に読み取ったのはそんなに多くないです。
また、xlrdでxlsxフォーマットを読み込むとたまに問題があると言われています。具体的にはテストしていません。しばらく使っても大丈夫です。
最後に、監視機能の運転時間を表示する装飾器を付けましょう。

import time
from functools import wraps

def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
      (function.__name__, str(t1-t0))
      )
    return result
  return function_timer
使い方としては、監視する関数の定義に@fn_をつけます。timerでいいです
以上の問題は、python実行の大きなexcelファイルのopenpyxlをまとめて皆さんに共有した内容です。参考にしていただければと思います。どうぞよろしくお願いします。