python列表占用的内存是预期的10倍

2024-04-19 19:41:00 发布

您现在位置:Python中文网/ 问答频道 /正文

python列表的效率非常低。即使在最简单的情况下,它所需的内存也要比具有相同数据的简单列表多10倍。以下代码说明了该问题:

import memory_profiler
import sys

t=[]

m=memory_profiler.memory_usage()
t= ["one two three four five" for l in range(60000000)]
print ("getsize={} | memory_usage={}".format(sys.getsizeof(t),memory_profiler.memory_usage()[0]-m[0]))


m=memory_profiler.memory_usage()
t= [["one two three four five"] for l in range(60000000)]
print ("getsize={} | memory_usage={}".format(sys.getsizeof(t),memory_profiler.memory_usage()[0]-m[0]))

import gc
gc.collect()
print ("getsize={} | memory_usage={}".format(sys.getsizeof(t),memory_profiler.memory_usage()[0]-m[0]))

此代码输出如下内容:

getsize=536721616 | memory_usage=459.4375
getsize=536721616 | memory_usage=4181.0703125
getsize=536721616 | memory_usage=4181.0703125

有什么方法可以治愈这种行为吗?你知道吗

使用generator不是一个选项,我需要内存中的数据供多个工作人员稍后处理。数据必须采用列表格式。你知道吗


Tags: 数据内存代码importformat列表sysusage
1条回答
网友
1楼 · 发布于 2024-04-19 19:41:00

python中的列表是可调整大小的数组。为了给您一个list.append()的有效实现,一些内存在列表的实际存储之后被预先分配。你知道吗

元组没有这个问题,它们是不可变的,因此内存分配可以适合实际使用的大小。试着把["one two three four five"]改成("one two three four five",)(别忘了,,就像我在原始消息中做的那样,否则它不是元组):内存使用量会大大降低。我得到(60万美元,以避免我的笔记本电脑的RAM被炸掉):

getsize=4826320 | memory_usage=18.94140625
getsize=4826320 | memory_usage=4.2421875
getsize=4826320 | memory_usage=4.2421875

这实际上是令人惊讶的,它低于纯列表实现,但我没有一个解释!你知道吗

无论如何,如果您开始担心性能,很可能意味着Python,或者至少Python的原生数据结构不是合适的工具。例如,如果你想操纵矩阵,数字列表将是一个真正的痛苦,而NumPy的数组将是既高效又方便。你知道吗

相关问题 更多 >