【问题标题】:Processing time difference between tuple-listtuple-list 之间的处理时间差
【发布时间】:2015-01-29 23:12:10
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试计时x = list(t for t in range(100000)),您的第一个示例是在生成器表达式上调用元组,因此它们不会做同样的工作
  • 还有x = tuple(t for t in range(100000))
  • 那不就是一个列表吗?
  • @alana,这是一个列表
  • 但我希望 x 作为一个元组和 y 作为一个列表

标签: python list time tuples python-3.4


【解决方案1】:

元组操作不一定更快。不可变最多为更多优化打开了大门,但这并不意味着 Python 可以做到,或者它们适用于所有情况。

这里的差异非常微小,并且 - 没有进行分析确认 - 它似乎可能与具有额外名称查找和函数调用的生成器版本有关。如 cmets 中所述,将列表解析重写为对生成器表达式的 list 的调用,差异可能会缩小。

【讨论】:

    【解决方案2】:

    使用比较方法测试元组稍微快一些:

    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
    

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

    【讨论】:

    • tuple(range(10**5)) 在我的机器上比list(range(10**5)) 稍慢:3.2 vs. 3.06 ms
    • @J.F.Sebastian,嗯,我的速度稍微快一点,正如我在回答中指出的那样,两种方式几乎没有区别,真正的比较方法是使用最后一个示例。
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多