python - 减少 multiprocessing.Pool.starmap() 列表的内存大小

标签 python list numpy memory multiprocessing

所以我创建了一个多处理列表(特别是 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() 时,它无论如何都会转换回列表。

最佳答案

在检查这些数组的大小之前,您正在将数组转换为 Python List。 里面的整数被转换为 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 本身有这么多功能,将操作和数据保持在较低级别。

关于python - 减少 multiprocessing.Pool.starmap() 列表的内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155186/

相关文章:

python - cx_Oracle 游标忘记聚合时的列比例

python - 现场交叉口操作

python - 如何循环遍历列表并取出几个不同的变量?

python - 通过 Python 中的迭代在 numpy/scipy 中建立一个数组?

python - 使用 sklearn 在 Python 中初始化参数高斯混合

python - 检查一组的所有成员是否具有相同的值,然后将它们全部放入一个数据帧中

Python 在字符串列表中的搜索模式

python - Numpy - 对矩阵中所有行的组合应用自定义函数以获得新矩阵?

python - 如何在xlwings中选择整个工作表

python - list() 与 Python 3.5+ 中的可迭代拆包