我有一个相对中等大小的电子表格 - 212行×56列的数据。如何加速从小电子表格中读取数据?
我有一个循环,逐渐变得越来越慢,越接近我的搜索到我的电子表格的底部。如果可以达到200ms,最高可达7000ms,可以返回响应。
如何加快搜索速度,使时间至少保持不变或至少显着加速,从而永远不会超过500毫秒。
这里是我怎样,我打开电子表格:
wb = openpyxl.load_workbook('data/%s' % filename, read_only=True)
sheet = wb.get_sheet_by_name('Service%s' % service)
这里是我的循环:
for i in range(3, sheet.max_row+1):
if str(sheet.cell(row=i, column=1).value) == country:
for x in range(2, sheet.max_column+1):
if weight > float(sheet.cell(row=2, column=sheet.max_column).value):
abort(404, "Maximum Weight Exceeded for Service Class")
if weight < float(sheet.cell(row=2, column=2).value):
return float(sheet.cell(row=i, column=2).value)
if weight == float(sheet.cell(row=2, column=x).value):
return float(sheet.cell(row=i, column=x).value)
if weight < float(sheet.cell(row=2, column=x).value):
return float(sheet.cell(row=i, column=x).value)
编辑:
经过大家的建议,我已经重构的方法。它似乎要快得多,但我不确定如何访问嵌套在for循环中的特定行。下面的新代码:
if weight > float(sheet.cell(row=2, column=sheet.max_column).value):
abort(404, "Maximum Weight Exceeded for Service Class")
minweight = float(sheet.cell(row=2, column=2).value)
for row in sheet.rows:
if row[0].value == country:
if weight < minweight:
return row[1].value
for cell in row[1:]: # skip first item
if weight <= float(cell.value):
# This is wrong. I need to compare weight to cell values in the 2nd row
return float(cell.value)
编辑2 - 现在运行〜300ms的:
if weight > float(sheet.cell(row=2, column=sheet.max_column).value):
abort(404, "Maximum Weight Exceeded for Service Class")
minweight = float(sheet.cell(row=2, column=2).value)
ignore_first_row, weight_list = islice(sheet.rows, 0, 2)
for row in islice(sheet.rows, 2, sheet.max_row):
if row[0].value == country:
if weight < minweight:
return row[1].value # return country's min rate
for ratecell, weightcell in izip(row, weight_list):
if weight <= float(weightcell.value):
return float(ratecell.value)
你得到什么那里看,你肯定可以改善你的if语句。你在'for循环范围()'中,并且你的一个逻辑检查不使用'x'或'i'。具体来说,它看起来像'if weight> float(sheet.cell(row = 2) ,column = sheet.max_column).value)'可以在循环之外移动? – MikeTGW
是很好的捕获,并将它移到循环之外;虽然会对性能产生很大影响? – K997
按顺序搜索平面文件显然需要更长的时间才能在文件末尾找到匹配,而与接近开始的匹配相比。这是顺序搜索的固有特性。 尽管如此,7000毫秒却非常慢,这让我怀疑你正在做大量额外的磁盘读取。而不是任意微观优化,可以使用诸如“cProfile”之类的分析器来衡量需要花费的时间。 这就是说,我会开始迭代使用'sheet.iter_rows()'或'sheet.rows'行而不是单元格查找。 –