使用openpyxl访问workhet。哪种方法更快?

时间:2019-08-20 08:48:31

标签: python openpyxl timeit

我正在重构一个基于openpyxl的小项目,以分析.xlsx输入。我正在尝试减少其完成工作所需的时间,并且目前正在尝试访问Excel工作表的单元格值的方法。

我用timeit测试了两种方法(下面的代码),其中一种似乎比第一种快一倍。

import timeit
from openpyxl.reader.excel import ExcelReader

samplesPath = r'path_to_excel_file'

workbook = ExcelReader(samplesPath)
workbook.read()

worksheet = workbook.wb['Sheet1']

def func1():
    for i in range(1,10):
        worksheet.cell(i,1).value = 'value'

def func2():
    for i in range(1,10):
        workbook.wb['Sheet1'].cell(i,1).value = 'value'

print(timeit.timeit(func1))
print(timeit.timeit(func2))

Timeit分数:

func1 = 29.23 func2 = 51.07

有人可以解释一下将工作表另存为变量,然后使用它访问单元格值,以及每次调用工作表时访问它的区别吗?

它在后台有何变化?是否有更快的方法?

1 个答案:

答案 0 :(得分:1)

这个问题不是关于openpyxl本身。是的,您正在使用openpyxl,但是您的问题较为笼统,可以应用于许多其他情况。

现在,您并没有真正使用两种方法来访问单元格。您只使用一种,唯一的区别是访问工作表的方式。

func1中,您正在使用worksheet对象并访问其单元格。

func2中,您添加了另一个操作,该操作还在每次迭代时都访问工作表。进行workbook.wb['Sheet1']意味着访问工作簿的工作表池并获取名称为“ Sheet1”的工作表池。您是在每次迭代上执行此操作的,因此,与使用预取工作表相比,这当然会花费更多时间。


除此之外,这似乎花费了很多时间,其中一部分可能与打开文件的方式有关。似乎您过于复杂了。尝试做:

from openpyxl import load_workbook
workbook = load_workbook(path)
worksheet = workbook['Sheet1']