当前位置: 首页 > 面试题库 >

为什么元组比Python中的列表快?

漆雕恺
2023-03-14
问题内容

我刚刚读过“深入Python”,“元组比列表快”。

元组是不可变的,列表是可变的,但是我不太明白为什么元组更快。

有人对此进行过性能测试吗?


问题答案:

所报告的“构建速度”比率仅适用于 常量 元组(其项目由文字表示的元组)。仔细观察(并在您的机器上重复-您只需要在shell
/命令窗口中键入命令即可!)…:

$ python3.1 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]'
1000000 loops, best of 3: 0.379 usec per loop
$ python3.1 -mtimeit '[1,2,3]'
1000000 loops, best of 3: 0.413 usec per loop

$ python3.1 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)'
10000000 loops, best of 3: 0.174 usec per loop
$ python3.1 -mtimeit '(1,2,3)'
10000000 loops, best of 3: 0.0602 usec per loop

$ python2.6 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]'
1000000 loops, best of 3: 0.352 usec per loop
$ python2.6 -mtimeit '[1,2,3]'
1000000 loops, best of 3: 0.358 usec per loop

$ python2.6 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)'
10000000 loops, best of 3: 0.157 usec per loop
$ python2.6 -mtimeit '(1,2,3)'
10000000 loops, best of 3: 0.0527 usec per loop

我没有在3.0上进行测量,因为我当然没有它-它已经完全过时了,绝对没有理由保留它,因为3.1在各个方面都优于它(Python
2.7,如果您可以升级到它,每个任务的执行速度比2.6快20%,而2.6比3.1快。因此,如果您非常在意性能,Python
2.7确实是您应该唯一的发行版本争取!)。

无论如何,这里的关键点在于,在每个Python版本中,从常量文字中构造列表的速度大约与从变量引用中构造值的速度相同或稍慢。但是元组的行为却大不相同-
从常量文字中构建元组通常比从变量引用的值中构建元组快三倍!您可能想知道这怎么可能,对吧?

答案:由常量文字组成的元组可以很容易地被Python编译器识别为一个不变的常量文字本身:因此,当编译器将源代码转换为字节码并保存在“常量表”中时,它实际上只构建了一次相关功能或模块的“”。当这些字节码执行时,它们只需要恢复预构建的常量元组-嘿,很高兴!-)

这种简单的优化无法应用于列表,因为列表是可变对象,因此至关重要的是,如果相同的表达式(如[1, 2, 3]执行两次)(在循环中-timeit模块代表您执行循环;-),每次都会重新构造一个新的列表对象-
并且这种构造(例如当编译器无法简单地将其标识为编译时常量和不可变对象时的元组构造)确实需要一些时间。

话虽这么说,元组构造(实际上必须同时发生两种构造)仍然快于列表构造的两倍- 这种
差异可以用元组的纯粹性来解释,其他答案也多次提到。但是,这种简单性并不能解决六倍或更多倍的加速问题,正如您观察到的那样,如果您只比较列表和元组的构造以及简单常量文字作为它们的项!_)



 类似资料:
  • 问题内容: 以下代码段带有输出注释(如ideone.com所示): 有人可以解释为什么这样的输出吗? 实施细节 语言规范规定了这种行为,还是由实施者决定? 任何主要的Python实现之间都有区别吗? Python语言的版本之间有区别吗? 问题答案: 从python 2手册: CPython实现细节:除数字外,其他类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。 当你对两个字

  • 我必须将元组与元组列表进行比较,如果整数小于列表中的任何元组,则返回True。例如,如果我有将返回True,因为单独元组(“番茄”,10,5)中的整数比列表中的元组(“橙色”,11,6)小,但是如果我有将返回False。 我试试这个 但不工作时,它应该返回假,我不知道为什么? 注意:字符串对于这个问题并不重要,我必须忽略它。

  • 元组和列表同属序列类型,且都可以按照特定顺序存放一组数据,数据类型不受限制,只要是 Python支持的数据类型就可以。那么,元组和列表有哪些区别呢?元组和列表最大的区别就是,列表中的元素可以进行任意修改,就好比是用铅笔在纸上写的字,写错了还可以擦除重写;而元组中的元素无法修改,除非将元组整体替换掉,就好比是用圆珠笔写的字,写了就擦不掉了,除非换一张纸。

  • 问题内容: 有什么不同? 元组/列表的优点/缺点是什么? 问题答案: 除了元组是不可变的之外,还应有语义上的区别来指导它们的用法。元组是异构数据结构(即,它们的条目具有不同的含义),而列表是同类序列。元组具有结构,列表具有顺序。 使用这种区别可以使代码更加明确和易于理解。 一个示例是成对的页和行号,以成对参考书中的位置,例如: 然后,您可以将其用作字典中的键来存储有关位置的注释。另一方面,列表可用

  • 问题内容: 我有一个这样的元组列表: 而且我需要将所有元组的交集合并起来。 那就是相交的元组是迭代地联合的。 我试图将元组转换为集合,然后采用交集,但没有用。任何想法? 问题答案: 这是网络问题,使用

  • 我正在尝试将列表转换为元组。 Google上的大多数解决方案提供以下代码: 但是,当我运行代码时,它会产生一条错误消息: TypeError:“tuple”对象不可调用 我如何解决这个问题?