我刚刚阅读了这个问题:为什么Python中没有元组推导?
在被接受的答案的评论中,有人说目前没有真正的“元组推导”。相反,我们现在的选择是使用生成器表达式并将生成器对象传递给元组构造函数:
最后,与被接受的回答相反,一篇较新的回答指出元组推导确实存在(自Python 3.5起),使用以下语法:
tuple(thing for thing in things)
另一种方法是使用列表推导式创建一个列表,然后将该列表传递给元组构造函数:
tuple([thing for thing in things])
最后,与被接受的回答相反,一篇较新的回答指出元组推导确实存在(自Python 3.5起),使用以下语法:
*(thing for thing in things),
在我看来,第二个示例也是先创建了生成器对象。这是正确的吗?
这些表达式在背后发生的情况上有什么区别吗?在性能方面呢?我认为第一个和第三个可能会有延迟问题,而第二个可能会有内存问题(如链接的评论中所讨论的那样)。
- 比较第一个和最后一个,哪一个更符合Python风格?
更新:
正如预期的那样,列表推导确实要快得多。然而,我不明白为什么第一个比第三个更快。有什么想法吗?
>>> from timeit import timeit
>>> a = 'tuple(i for i in range(10000))'
>>> b = 'tuple([i for i in range(10000)])'
>>> c = '*(i for i in range(10000)),'
>>> print('A:', timeit(a, number=1000000))
>>> print('B:', timeit(b, number=1000000))
>>> print('C:', timeit(c, number=1000000))
A: 438.98362647295824
B: 271.7554752581845
C: 455.59842588083677
%timeit
。找出在你的特定机器上哪个更好。 - John Zwinckx for y in z
看起来像是一个生成器,但实际上并不是。其内部机制是不同的。例如,在x
部分引发的StopIteration
会停止生成器,但会从列表推导式中冒出。 - user2390182x for x in y
而不是x for y in z
。 关于这里提出的其他观点,我同意你们所有人。 - Lucubrator