Python 3.x 列表推导 VS 元组生成器

rag*_*ner 6 python performance list generator python-3.x

是否有任何我想使用的内存、速度或其他原因:

tuple(i for i in range(5000))
Run Code Online (Sandbox Code Playgroud)

代替:

[i for i in range(5000)]
Run Code Online (Sandbox Code Playgroud)

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

Kas*_*mvd 6

基本上,列表理解比生成器表达式快,原因是它的迭代在 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • “它的迭代在 C 中执行” → 这是关于 Python 的最普遍、完全错误的神话之一。列表推导速度更快,因为挂起和恢复函数的框架很慢,而不是因为列表推导有什么特别之处。 (5认同)