python sizeof 列表与 sizeof 元组
python sizeof list vs sizeof tuple
我在 python 中注意到以下事实:
>>> (1, 2, 3).__sizeof__()
48
>>> [1, 2, 3].__sizeof__()
64
我理解列表和元组之间的区别,但我希望它们的 sizeof (size of object in memory)
是相同的:都带有方法并且都包含相同的值。
此外,尺码差异取决于商品长度:
>>> for size in (10, 100, 1000, 10000):
tuple_ = tuple(range(size))
list_ = list(range(size))
print list_.__sizeof__(), tuple_.__sizeof__()
176 104
984 824
9088 8024
90088 80024
- 我们如何解释这个?
- 在哪里可以找到 python 内部的好文档?
list
对象被设计为动态增长(通过 append
、extend
或列表理解构建)。每次添加元素时都执行 realloc(可能还有 memmove
),性能不佳。所以有一个 "growth" 算法试图预测需要多少元素(当然这只是一个统计猜测)。
这就是为什么实际分配的内存可以大于项目数的原因。
tuple
对象是不可变的。 Python 没有理由 pre-allocate 更多元素。
列表增长算法的一些参考:
- http://www.laurentluce.com/posts/python-list-implementation/
- Size of list in memory
根据来自 Are tuples more efficient than lists in Python? 的 Raymond Hettinger 和 tzot 的说法,
基本上,元组可以比列表更快地访问,因为它的存储效率更高,因为元组是不可变的。
列表,与元组相反,是从头开始构建的。
如果您想遍历常量序列,元组更好,因为它们在 python 代码编译为字节码时进行了计算。
元组对象在内存中的大小小于列表。但这只有在使用大对象时才会注意到。这就是使元组操作更快的原因。
我在 python 中注意到以下事实:
>>> (1, 2, 3).__sizeof__()
48
>>> [1, 2, 3].__sizeof__()
64
我理解列表和元组之间的区别,但我希望它们的 sizeof (size of object in memory)
是相同的:都带有方法并且都包含相同的值。
此外,尺码差异取决于商品长度:
>>> for size in (10, 100, 1000, 10000):
tuple_ = tuple(range(size))
list_ = list(range(size))
print list_.__sizeof__(), tuple_.__sizeof__()
176 104
984 824
9088 8024
90088 80024
- 我们如何解释这个?
- 在哪里可以找到 python 内部的好文档?
list
对象被设计为动态增长(通过 append
、extend
或列表理解构建)。每次添加元素时都执行 realloc(可能还有 memmove
),性能不佳。所以有一个 "growth" 算法试图预测需要多少元素(当然这只是一个统计猜测)。
这就是为什么实际分配的内存可以大于项目数的原因。
tuple
对象是不可变的。 Python 没有理由 pre-allocate 更多元素。
列表增长算法的一些参考:
- http://www.laurentluce.com/posts/python-list-implementation/
- Size of list in memory
根据来自 Are tuples more efficient than lists in Python? 的 Raymond Hettinger 和 tzot 的说法,
基本上,元组可以比列表更快地访问,因为它的存储效率更高,因为元组是不可变的。
列表,与元组相反,是从头开始构建的。
如果您想遍历常量序列,元组更好,因为它们在 python 代码编译为字节码时进行了计算。
元组对象在内存中的大小小于列表。但这只有在使用大对象时才会注意到。这就是使元组操作更快的原因。