我目前正在努力将一些excel工作表转移到python自动化,并且遇到了速度问题。
我有一个列表,其中包含大约10,000个列表,每个列表包含20个左右的列。我还有一个帐号列表(100.000个数字)
如果列表中的帐号与帐户列表中的帐号匹配,我希望迭代列表列表,然后从列表中选择值。
通过运行此代码,我可以获得所需的结果,但速度非常慢。
calc = 0
for row in listOfLists:
if row[1] in Accounts:
calc += row[8]
关于如何优化速度的任何想法?
答案 0 :(得分:7)
让Accounts
成为set
。包含检查为O(1)
for sets, but O(N)
for lists。您的整个流程的时间复杂度将从O(M*N)
降低到O(M+N)
。您可以使用条件sum
进一步使用generator expression:
account_set = set(Accounts)
calc = sum(row[8] for row in listOfLists if row[1] in account_set)
答案 1 :(得分:2)
这种功能方法,使用set
而不是Accounts
作为@schwobaseggle回答:
account_set = set(Accounts)
calc = reduce(lambda row: row[8] if row[1] in account_set else 0, listOfLists , 0)