【问题标题】:python sizeof list vs sizeof tuplepython sizeof list vs sizeof tuple
【发布时间】:2023-03-10 09:35:01
【问题描述】:

我在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 内部的好文档?

【问题讨论】:

    标签: python sizeof internals


    【解决方案1】:

    list 对象被设计为动态增长(通过appendextend 或列表理解构建)。每次添加元素时执行 realloc (可能还有memmove)不会很高效。所以有一个“增长”算法试图预测需要多少元素(当然这只是一个统计猜测)。

    这就是为什么实际分配的内存可能大于项目数的原因。

    tuple 对象是不可变的。 Python 没有理由预先分配更多的元素。

    关于列表增长算法的一些参考资料:

    【讨论】:

      【解决方案2】:

      Are tuples more efficient than lists in Python? 的 Raymond Hettinger 和 tzot 所说,

      基本上,元组可以比列表更快地访问,因为元组是不可变的,因此存储效率更高。

      列表,与元组相反,是从头开始构建的。

      如果您想遍历一个常量序列,元组会更好,因为它们是在 Python 代码编译为字节码时计算出来的。

      【讨论】:

      • 在看到compile time 之前,我很喜欢你的评论。我错过了什么吗?
      • @OrDuan ,python源码编译成字节码的时间(字节码可能保存为.py[co]文件)。
      • @omri_saadon pyo/pyc 文件在脚本启动中更快,如果您在函数中使用变量/__main__ 应该不会有任何性能提升,对吗?只是想确保我在这里得到所有东西。
      【解决方案3】:

      内存中元组对象的大小小于列表。但这仅在使用大物体时才明显。这就是使元组操作更快的原因。

      【讨论】:

        猜你喜欢
        • 2013-02-19
        • 2012-04-13
        • 2014-12-26
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2020-01-06
        相关资源
        最近更新 更多