所以我为多处理的东西创建了一个列表(特别是它multiprocessing.Pool().starmap()
),并希望减少它的内存大小。列表如下:
import sys
import numpy as np
from itertools import product
lst1 = np.arange(1000)
lst3 = np.arange(0.05, 4, 0.05)
lst1_1 = list(product(enumerate(lst3),
(item for item in product(lst1, lst1) if item[0] < item[1])
))
根据sys.getsizeof(lst1_1)
计算出的内存大小317840928
看到lst1
的类型是int32
,我认为将 lst 的 dtype 更改为int16
可以减少lst1
的内存大小,因此ls1_1
一半,因为int16
占用了一半的内存作为int32
数据,所以我做了以下操作:
lst2 = np.arange(1000, dtype = np.int16)
lst2_1 = list(product(enumerate(lst3),
(item for item in product(lst2, lst2) if item[0] < item[1])
))
令人惊讶的是,sys.getsizeof(lst2_1)
计算的lst2_1
的内存大小仍然317840928
。
我的问题如下:
1) 列表的内存大小是否独立于源数据的数据类型?
2)如果是这样,那么在不转换为生成器的情况下减少列表内存大小的最佳方法是什么?
请注意,转换为生成器无济于事的原因是,即使它被转换为生成器,当它被扔进multiprocessing.Pool().starmap()
时,它无论如何都会转换回列表。
在检查这些数组的大小之前,您要将数组转换为 PythonList
s。 里面的整数被转换为 Python 对象。当您这样做时,它会导致更大的尺寸。下面是代码的一个示例行为。
import sys
import numpy as np
lst1 = np.arange(1000)
lst2 = np.arange(1000, dtype = np.int16)
print(sys.getsizeof(lst1)) # 4096
print(sys.getsizeof(lst2)) # 2096
print(sys.getsizeof(list(lst1))) # 9112
print(sys.getsizeof(list(lst2))) # 9112
Numpy
是一个基于 C 的库,因此您可以选择要使用的整数类型(就像 int、long、long long 一样)。您需要将数据保持在 C 型中,以便保留这些优势。这就是为什么Numpy
本身具有如此多的功能,将操作和数据保持在较低的级别。