想知道为什么这个元组进程;
x = tuple((t for t in range(100000)))
# 0.014001131057739258 seconds
比此列表更长;
y = [z for z in range(100000)]
# 0.005000114440917969 seconds
我了解到tuple
进程比list
更快,因为元组是不可变的。
编辑:我更改了代码后;
x = tuple(t for t in range(100000))
y = list(z for z in range(100000))
>>>
0.009999990463256836
0.0
>>>
结果如下:仍然是一个较慢的元组。
答案 0 :(得分:1)
元组操作不一定更快。最多不变是打开通向更多优化的大门,但这并不意味着Python会在每种情况下都适用它们。
这里的差异是非常小的,并且 - 没有分析确认 - 似乎它与具有额外名称查找和函数调用的生成器版本有关。正如评论中所提到的,将列表理解重写为围绕生成器表达式的list
调用,差异可能会缩小。
答案 1 :(得分:0)
使用测试元组的比较方法稍快一些:
In [12]: timeit tuple(t for t in range(100000))
100 loops, best of 3: 7.41 ms per loop
In [13]: timeit list(t for t in range(100000))
100 loops, best of 3: 7.53 ms per loop
调用列表确实会创建一个列表:
In [19]: x = list(t for t in range(10))
In [20]: x
Out[20]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我们还可以看到生成器上的调用列表没有像使用列表解析那样分配空间:
In [28]: x = list(t for t in range(10))
In [29]: sys.getsizeof(x)
Out[29]: 168
In [30]: x = [t for t in range(10)]
In [31]: sys.getsizeof(x)
Out[31]: 200
因此两个操作非常相似。
更好的比较是将列表和元组创建为子元素:
In [41]: timeit tuple((t,) for t in range(1000000))
10 loops, best of 3: 151 ms per loop
In [42]: timeit list([t] for t in range(1000000))
1 loops, best of 3: 247 ms per loop
现在我们看到了更大的差异。