Python 3.x列表理解VS元组生成器

时间:2017-05-05 15:00:39

标签: python performance list generator list-comprehension

我想要使用内存,速度或其他什么原因:

tuple(i for i in range(5000))

而不是:

[i for i in range(5000)]

如果我不介意元组的不变性

2 个答案:

答案 0 :(得分:4)

基本上,列表理解比生成器表达式更快,原因是其迭代在C 中执行(阅读@ Veedrac评论的原因)。但是在元组中使用生成器表达式的唯一原因是你想对你的项目执行一些操作和/或过滤它们,更重要的是你想要一个元组(因为它具有不变性及其对可变对象的好处)。

毕竟你可以随时timeit代码:

In [10]: %timeit tuple(i for i in range(5000))
1000 loops, best of 3: 325 µs per loop

In [11]: %timeit [i for i in range(5000)]
1000 loops, best of 3: 199 µs per loop

另请注意,正如我所提到的,如果你想使用理解,你必须对你的项目执行操作,否则你可以直接在你的迭代器上调用函数,这更快:

In [12]: %timeit list(range(5000))
10000 loops, best of 3: 98.3 µs per loop

答案 1 :(得分:1)

生成器表达式(或简称​​ genexps )最好用于循环中,以便在处理大量数据时节省内存。将genexp扩展为可互换的数据类型(例如列表,元组,集合)并不是一种好的做法。

另请注意,Python 3中的range()与Python 2中的xrange()类似。它返回一个生成器。实际上,xrange()往往更快,即使是5000.注意:Python 3中不存在xrange()。