改善Python代码段性能

时间:2013-07-01 10:51:26

标签: python performance optimization

这句话运行得非常缓慢,我已经没有想法来优化它。有人可以帮助我吗?

[dict(zip(small_list1, small_list2)) for small_list2 in really_huge_list_of_list]

small_list只包含大约6个元素。

大小为209,510的really_huge_list_of_list大约需要16.5秒才能完成执行。

谢谢!

修改

really_huge_list_of_list是一个生成器。为任何困惑道歉。 大小从结果列表中获得。

2 个答案:

答案 0 :(得分:1)

可能的小改进:

[dict(itertools.izip(small_list1, small_list2)) for small_list2 in really_huge_list_of_list]

此外,您可以考虑使用生成器而不是列表推导。

答案 1 :(得分:1)

要扩展评论试图说的内容,您应该使用生成器而不是列表理解。您的代码目前看起来像这样:

[dict(zip(small_list1, small_list2)) for small_list2 in really_huge_list_of_list]

你应该改为:

def my_generator(input_list_of_lists):
    small_list1 = ["wherever", "small_list1", "comes", "from"]
    for small_list2 in input_list_of_lists:
        yield dict(zip(small_list1, small_list2))

你现在正在做的是在对你的结果列表做任何事情之前,将所有结果迭代到你真正庞大的列表上,并建立一个巨大的结果列表。相反,您应该将该列表理解转换为生成器,这样您就不必构建包含200,000个结果的列表。它构建的结​​果列表占用了大量的内存和时间。

......或者更好的是,只需将其外部括号更改为括号,即可将该列表理解转换为生成器理解:

(dict(zip(small_list1, small_list2)) for small_list2 in really_huge_list_of_list)

这就是你真正需要做的。列表推导和生成器理解的语法几乎完全相同,如果您理解列表理解,您将理解相应的生成器理解。 (在这种情况下,我首先以“长形式”写出了生成器,这样你就可以看到那种理解扩展到了什么。)

有关生成器理解的更多信息,请参阅herehere和/或here

希望这可以帮助您为Python工具箱添加另一个有用的工具!