0

这个语句运行得很慢,我已经没有优化它的想法了。有人可以帮我吗?

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

s 仅包含大约 6个small_list元素。

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

谢谢!

编辑:

really_huge_list_of_list是一个发电机。对任何混淆表示歉意。大小从结果列表中获得。

4

2 回答 2

1

可能的小改进:

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

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

于 2013-07-01T10:57:27.977 回答
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)

这就是你真正需要做的。列表推导和生成器推导的语法几乎是相同的,这是故意的:如果你理解了列表推导,你就会理解相应的生成推导。(在这种情况下,我首先以“长格式”写出生成器,以便您看到该理解扩展为什么)。

有关生成器推导的更多信息,请参见此处此处和/或此处

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

于 2013-07-01T12:50:43.650 回答