处理元组列表之间的时间差

时间:2015-01-29 23:12:10

标签: python list time tuples python-3.4

想知道为什么这个元组进程;

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
>>> 

结果如下:仍然是一个较慢的元组。

2 个答案:

答案 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

现在我们看到了更大的差异。