加速python列表搜索(嵌套for循环)

时间:2018-01-16 09:55:50

标签: python loops optimization

我目前正在努力将一些excel工作表转移到python自动化,并且遇到了速度问题。

我有一个列表,其中包含大约10,000个列表,每个列表包含20个左右的列。我还有一个帐号列表(100.000个数字)

如果列表中的帐号与帐户列表中的帐号匹配,我希望迭代列表列表,然后从列表中选择值。

通过运行此代码,我可以获得所需的结果,但速度非常慢。

calc = 0
for row in listOfLists:
    if row[1] in Accounts:
        calc += row[8]

关于如何优化速度的任何想法?

2 个答案:

答案 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)