Python效率:列表与元组

Pau*_*han 8 python optimization python-2.6 python-2.7

我有一定数量的基础对象.

这些基础对象将被放入集合中,这些集合将被包围:排序,截断等.

不幸的是,n足够大,内存消耗略微令人担忧,速度越来越快.

我的理解是元组的内存效率略高,因为它们是经过重复数据删除的.

无论如何,我想知道Python 2.6/2.7中列表与元组的cpu /内存权衡是什么.

Han*_*Gay 16

如果你有一个元组和一个具有相同元素的列表,那么元组占用的空间更少.由于元组是不可变的,你不能对它们进行排序,添加它们等等.我建议观看Alex Gaynor的这个演讲,快速介绍何时选择Python中的数据结构.

更新:再考虑一下,您可能希望研究优化对象的空间使用情况,例如,通过__slots__或使用namedtuple实例作为代理而不是实际对象.这可能会带来更大的节省,因为你有N个,并且(只有少数)它们出现的集合.namedtuple特别是超级棒!查看Raymond Hettinger的演讲.


jat*_*ism 9

正如其他人所说,元组是不可改变的.对元组进行排序(例如sorted(mytuple))会返回一个列表,然后您必须将其转换回元组.

要对元组进行排序(并保持元组),您必须这样做:

mytuple = (3,2,1)
mysortedtuple = tuple(sorted(mytuple))
Run Code Online (Sandbox Code Playgroud)

要对列表进行排序,您必须执行此操作:

mylist = [3,2,1]
mylist.sort()
Run Code Online (Sandbox Code Playgroud)

因为你没有铸造和重铸,所以在这种情况下,后者更有效率.

除非你有充分的理由,否则不要挂在列表上使用元组.如果您需要排序数据,那么除非首先以这种方式创建元组,否则元组不是必须的.当它们包含的数据不会更改时,例如使用在运行时加载的配置设置或已经处理的数据,元组会表现出色.

考虑到您提到您正在处理大型数据集,您可能希望通过列表和元组上的生成器和迭代器来查看函数式编程样式.这样你就不会穿梭并创建新的容器,而只是链接迭代操作以获得最终结果.

进一步阅读:


Thi*_*ter 1

您无法对不可变对象进行排序 - 即,在对元组进行排序时,您始终会创建一个新对象。