【问题标题】:Is it OK to create very large tuples in Python?在 Python 中创建非常大的元组可以吗?
【发布时间】:2017-10-14 18:43:30
【问题描述】:

我的 Python 程序中有一个相当大的相同类型对象列表(>1K 个元素)。该列表永远不会被修改 - 不会添加、删除或更改任何元素。将对象放入元组而不是列表有什么缺点吗?

一方面,元组是不可变的,因此符合我的要求。另一方面,使用这么大的元组感觉是错误的。在我看来,元组一直是用于小集合的。是双倍、三倍、四倍……不是两千五十七倍。

我对大型元组的恐惧是否合理?它对性能、非 Python 或其他不好的做法有害吗?

【问题讨论】:

  • @Jan 如果我错了请纠正我,但我不能这样做len(generator)。我需要能够做到这一点。
  • 异质结构的元组,同质结构的列表。
  • 你是如何创建列表的?既然你不能一块一块地建立一个元组,我只能想象你想做类似my_tuple = tuple(my_list)的事情,但在那种情况下,这样做有什么好处?从预先存在的列表创建元组所花费的时间似乎不值得仅仅为了确保没有人尝试修改它。
  • 这是元组的一个很好的用途,如果你不想修改,它是首选。我不知道整个异质/同质的东西是什么,这对我来说听起来很奇怪。
  • 在内部,两者都只是连续的内存区域,因此性能上应该没有任何差异。一个元组可能占用更少的空间,因为列表会预先分配一些额外的空间,但这在实践中并不重要。您应该关心的唯一区别是您是否要保护对象不被编辑。

标签: python list collections tuples


【解决方案1】:

是的,没关系。

但是,根据您正在执行的操作,您可能需要考虑在 Python 中使用 set 函数。这会将您的输入可迭代(元组、列表或其他)转换为集合。集合很好有几个原因,但特别是因为您获得了一个独特的项目列表,可以持续查找项目。

不过,在内存中保存大型数据集并没有什么“非 Python 式”。

【讨论】:

    【解决方案2】:

    在 CPython 中,继续。在幕后,列表和元组的存储之间唯一真正的区别是保存元组元素的 C 级数组分配在 in 元组对象中,而列表对象包含一个指针 一个包含列表元素的 C 级数组,该数组与列表对象分开分配。列表实现需要这样做,因为列表可能会增长,因此包含 C 级向量的内存可能需要更改其基地址。元组不能改变大小,所以它的内存直接在元组对象中分配。

    我已经创建了包含数百万个元素的元组,但我还活着输入它;-)

    晦涩

    在 CPython 中,甚至有“理由”更喜欢巨型元组:如果元组只包含不可变对象,则循环垃圾回收方案可以免除对元组的定期扫描。那么元组永远不能成为循环的一部分,所以循环 gc 可以忽略它。列表不能使用相同的优化;仅仅因为一个列表在一次循环 gc 运行期间只包含不可变对象并不能说明在下一次运行期间是否仍然如此。

    这几乎从来没有非常重要,但它可以在一个长期运行的程序中节省一个百分点左右,并且免除巨型元组的好处越大。

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2015-08-18
      • 2014-08-20
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多