我有一个列表my_list(列表包含utf8字符串):

>>> len(my_list)
8777
>>> getsizeof(my_list)                     #  <-- note the size
77848

出于某种原因,排序列表(my_sorted_list = sorted(my_list))会占用更多内存:

>>> len(my_sorted_list)
8777
>>> getsizeof(my_sorted_list)              #  <-- note the size
79104

为什么sorted返回的列表比最初未排序的列表占用更多内存空间?

推荐答案

作为Ignacio points out,这是因为Python分配的内存比所需的多一些.这样做是为了在列表上执行O(1) .appends.

sorted creates a new list超出提供的顺序,sorts it in place并返回它.要创建新列表,请使用Python extends an empty sized list with the one passed;这会导致观察到的过度分配(在调用list_resize后发生).你可以用list.sort来证实排序不是罪魁祸首;没有创建新列表的same algorithm is used(或者,众所周知,是performed in-place).当然,那里的尺码是don't differ码.

值得注意的是,这种差异主要出现在以下情况:

因此,通过列表comp:

l = [i for i in range(10)]

getsizeof(l)          # 192
getsizeof(sorted(l))  # 200

或列表文字:

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

getsizeof(l)          # 144
getsizeof(sorted(l))  # 200

尺寸更小(使用文字时更是如此).

当创建到list时,内存总是被过度分配;Python knows the sizes和preemptsfuture 的修改,根据大小过度分配位:

l = list(range(10))

getsizeof(l)          # 200
getsizeof(sorted(l))  # 200

因此,在列表的大小上没有观察到任何差异.


最后,我必须指出,这是Python的C个实现,即CPython.这是语言实现的细节,因此,你不应该以任何古怪的方式依赖它.

Jython、IronPython、PyPy和任何其他实现可能/可能不具有相同的行为.

Python-3.x相关问答推荐

PANDAS中当前数据帧的匹配与更新

无法使用xpath关闭selenium中的弹出窗口

匹配语句NaN

根据按不同列中的值分组的平均值划分 DataFrame

在 groupby 之后,Pandas 在特定类别中获得最常见和最后的值

使用 NaN 计算 pct_change 时如何避免 bfill 或 ffill

使用 Python 截断并重新编号对应于特定 ID/组的列

安装没有 sudo 权限的 python3 和 pip3

Pandas matplotlib:条形图占总数的百分比

为什么 Sympy 不能解决我的非线性系统? Python 解释器一直在执行,直到我终止进程

用于 BIG 数组计算的多处理池映射比预期的要慢

Pandas数据单调行为

Generic[T] 基类 - 如何从实例中获取 T 的类型?

ValueError:预期的 2D 数组,得到 1D 数组:

为什么中断比引发异常更快?

定义 True,如果没有定义,会导致语法错误

Python的max函数有多高效

如何为 Python 3.x 安装 psycopg2?

在 Meta 中创建具有动态模型的通用序列化程序

在 Visual Studio Code 中调试 Scrapy 项目