我的Python程序中有相同类型的对象的相当大的列表(> 1K元素)。永远不会修改列表 - 不添加,删除或更改任何元素。将对象放入元组而不是列表是否有任何缺点?
一方面,元组是不可变的,因此符合我的要求。另一方面,使用如此大的元组只是感觉错误。在我看来,元组一直是小集合。它是双重的,三重的,四重的...不是两千五十二重复。
我对大元组的恐惧是否合理?这对于表演,单声道或其他糟糕的练习有害吗?
答案 0 :(得分:17)
在CPython中,继续吧。在封面下,列表和元组的存储之间唯一真正的区别是,持有元组元素的C级数组在元组中分配,而列表对象包含指针 一个包含列表元素的C级数组,它与列表对象分开分配。列表实现需要这样做,因为列表可能会增长,因此包含C级向量的内存可能需要更改其基址。元组不能改变大小,因此它的内存直接分配在元组对象中。
我已经创建了具有数百万个元素的元组,然而我却活着打算关于它; - )
在CPython中,甚至可以出现"一个原因"更喜欢巨型元组:如果元组只包含不可变对象,则循环垃圾收集方案可以免除定期扫描的元组。然后元组永远不会成为循环的一部分,因此循环gc可以忽略它。相同的优化不能用于列表;只是因为一个列表在一次循环gc运行期间只包含不可变对象,所以没有说明在下一次运行期间是否仍然如此。
这几乎从来都不是很重要,但它可以在长期运行的程序中节省百分之一左右,免除巨型元组的好处越大,它们就越大。
答案 1 :(得分:0)
是的,没关系。
但是,根据您正在执行的操作,您可能需要考虑在Python中使用set
函数。这会将您的输入可迭代(元组,列表或其他)转换为集合。由于一些原因,集合很好,但尤其是因为您获得了一个唯一的项目列表,这些项目具有项目的恒定时间查找。
没有什么"非pythonic"但是,关于在内存中保存大型数据集。