|
|
1
98
报告中的“建设速度”比率仅适用于 元组(其项由文字表示的元组)。仔细观察(并在您的机器上重复——您只需在shell/命令窗口中键入命令即可!):
答:由常量文本组成的元组可以很容易地被Python编译器识别为一个不可变的常量文本本身:因此它基本上只构建一次,编译器将源代码转换为字节码,并隐藏在相关函数或模块的“常量表”中。当这些字节码执行时,它们只需要恢复预先构建的常量元组——嘿,presto!)
这种简单的优化方法不能应用于列表,因为列表是一个可变的对象,所以如果相同的表达式
也就是说,元组结构(当两种结构都必须 那个 |
|
|
2
30
执行摘要元组的性能往往优于列表 1) 元组可以是 constant folded .
4) 元组直接引用它们的元素。 元组可以固定折叠常量元组可以由Python的窥视孔优化器或AST优化器预先计算。另一方面,列表是从零开始构建的:
跑步
相反,
元组不会过度分配由于元组的大小是固定的,所以它可以比需要过度分配才能生成的列表存储得更紧凑 运营效率高。 这为元组提供了很好的空间优势:
以下是来自 Objects/listobject.c 这就解释了列表的作用:
元组直接引用它们的元素
这使元组在索引查找和解包方面具有较小的速度优势:
Here
元组
Here
名单是怎么写的
请注意,tuple对象直接合并了两个数据指针,而list对象有一个额外的间接层,指向保存这两个数据指针的外部数组。 |
|
|
3
28
亚历克斯给出了一个很好的答案,但我将试着扩展一些我认为值得一提的事情。任何性能差异通常都很小,并且是特定于实现的:所以不要把赌注押在它们身上。 在CPython中,元组存储在单个内存块中,因此创建一个新元组最糟糕的情况是只需要一个调用来分配内存。列表分为两个块:一个是包含所有Python对象信息的固定块,另一个是大小可变的数据块。这是创建元组速度更快的部分原因,但也可能解释了索引速度的细微差别,因为后面的指针少了一个。 CPython中还进行了优化,以减少内存分配:取消分配的列表对象保存在空闲列表中,以便可以重用,但分配非空列表仍然需要为数据分配内存。元组保存在20个不同大小的元组的空闲列表中,因此分配一个小元组通常根本不需要任何内存分配调用。 像这样的优化在实践中是有帮助的,但它们也可能会使过于依赖“timeit”的结果变得有风险,当然,如果您使用类似IronPython的方法,内存分配的工作方式会完全不同。 |
|
|
4
18
以上帝的力量
这表明tuple的迭代速度要比list快得多。对于索引,我得到了类似的结果,但是对于构造,tuple破坏了列表:
|
|
|
5
5
本质上是因为tuple的不变性意味着解释器可以使用比list更精简、更快的数据结构。 |
|
|
6
2
一个列表明显更快的领域是生成器的构造,尤其是列表理解要比最接近的元组等价物快得多,
请特别注意
|
|
|
7
2
在python中,我们有两种类型的对象。
1可变的
2不变的
.
元组的缺点:
|
|
|
8
0
python编译器将元组标识为一个不可变常量 列表是可变的对象。所以当我们更新列表时,编译器会更新条目 所以它比元组慢一点 |