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不是一个选项,我需要内存中的数据供多个工作人员稍后处理。数据必须采用列表格式。你知道吗
python中的列表是可调整大小的数组。为了给您一个
list.append()
的有效实现,一些内存在列表的实际存储之后被预先分配。你知道吗元组没有这个问题,它们是不可变的,因此内存分配可以适合实际使用的大小。试着把
["one two three four five"]
改成("one two three four five",)
(别忘了,
,就像我在原始消息中做的那样,否则它不是元组):内存使用量会大大降低。我得到(60万美元,以避免我的笔记本电脑的RAM被炸掉):这实际上是令人惊讶的,它低于纯列表实现,但我没有一个解释!你知道吗
无论如何,如果您开始担心性能,很可能意味着Python,或者至少Python的原生数据结构不是合适的工具。例如,如果你想操纵矩阵,数字列表将是一个真正的痛苦,而NumPy的数组将是既高效又方便。你知道吗
相关问题 更多 >
编程相关推荐