亚洲欧洲国产欧美一区精品,激情五月亚洲色五月,最新精品国偷自产在线婷婷,欧美婷婷丁香五月天社区

      python

      當(dāng)前位置:中華考試網(wǎng) >> python >> python問答 >> 文章內(nèi)容

      怎樣解決運(yùn)行較大excel文件openpyxl變慢問題

      來源:中華考試網(wǎng)  [2020年11月20日]  【

        平時打開小文件的時候沒有注意,當(dāng)偶爾有較大的excel需要運(yùn)行,就會出現(xiàn)openpyxl變慢問題 。今天小編就教大家解決運(yùn)行較大excel文件時openpyxl變慢的問題 。

        運(yùn)行以下代碼:

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

        13

        14

        15

        16

        17

        18

        19

        20

        21

        22

        23

        24

        25

        26

        

      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")

      python課程免費(fèi)試聽預(yù)約

      • 地區(qū):
      • 姓名:
      • 手機(jī):

        t0 = time.time()

        print(sh.cell(499,22).value)

        t1 = time.time()

        print("xlrd所用時間:", str(t1-t0))

        測試結(jié)果:

        1

        2

        3

        4

        

      22

        openpyxl所用時間: 0.44217610359191895

        23.0

        xlrd所用時間: 0.0010063648223876953

        結(jié)論

        openpyxl的慢是讀取慢,可以選擇xlrd代替,詳細(xì)測試下面繼續(xù)。

        不直接使用xlwt+xlrd是因?yàn)閤lwt僅支持2003及以下版本,最大行數(shù)限制在65536,不夠用,而openpyxl大概在一百多萬。

        主要的說完了,下面詳細(xì)說了:在寫工具的時候遇到的這個問題,開始是用的xlwt+xlrd,然后行數(shù)超標(biāo)了,沒辦法換成openpyxl使用excel2007的版本,原本測試不到三萬行的數(shù)據(jù),只要三四秒,換成openpyxl以后,花了好幾分鐘,具體沒看多少了,然后加上函數(shù)運(yùn)行時間的監(jiān)視器以后,才看到是讀取的時候出的問題。

        推測原因:

        推測的話,openpyxl的根據(jù)行號列號讀取的時候,是從第 一行第 一列開始遍歷,直到行號等于指定行號,列號等于指定列號,所以要讀取的行號列號越多就越慢,(也可能是從第 一個有數(shù)據(jù)的行或列),而xlrd則是類似與數(shù)組一樣,我們要取第幾個元素,直接根據(jù)下標(biāo)找到內(nèi)存中對應(yīng)地址的元素即可,所以無論excel總量多少,速度基本都是不變的。

        知識拓展:

        xlwt寫入僅支持65536行,那xlrd的讀取很可能也是,也就是超過這么多的數(shù)據(jù)可能也會出錯。

        我這里因?yàn)槭亲x多表數(shù)據(jù)生成單表數(shù)據(jù),生成方式大概是Na*Nb這樣,所以實(shí)際讀取的不會太多,但生成的很多,所以基本可以用考慮這個問題。

        另外,據(jù)說xlrd讀取xlsx格式的偶爾會出現(xiàn)問題,具體沒測試,暫時用還沒毛病。

        最后,順帶上一下監(jiān)控函數(shù)運(yùn)行時間的裝飾器吧:

        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

        13

        14

        

      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

        使用方式的話,就是在要監(jiān)控的函數(shù)定義上面加上 @fn_timer 就行了。

        相信下次用openpyxl打開大的excel文件后,小伙伴們不需要慢慢等待了。

      責(zé)編:fushihao
      • 會計(jì)考試
      • 建筑工程
      • 職業(yè)資格
      • 醫(yī)藥考試
      • 外語考試
      • 學(xué)歷考試