- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我创建了一个多处理列表(特别是 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/
我有一个可以并行运行多个查询的函数,但是我在使用 multiprocessing 运行我的函数时遇到了一些麻烦。我有这段代码: def run(args): query, cursor = a
我在尝试使用 multiprocessing.Pool.starmap 时遇到了一个奇怪的错误。重现错误所需的最少代码在这里: from multiprocessing import Pool # I
最初,对于我使用的代码,Pool.map 足以对我的代码进行线程化,因为只有一个参数(一个可迭代的)作为参数传入我的函数。现在,我需要将多个参数传递给该函数,但我在使用 Pool.starmap 时遇
是否有类似于 pools.starmap 的函数可以与字典列表一起使用? 代替 :pools.starmap(func, iterable_of_tuple) 你将会拥有:pools.starmapd
我正在使用多处理pool.starmap函数。我发现一个奇怪的问题。 from multiprocessing import Pool p = multiprocessing.Pool() NODE
我正在尝试一些网页抓取。我正在将包含 URL 的列表传递给 pool.starmap ,但我遇到了参数错误。显示我的代码的简化版本: 有人可以帮我解决这个问题吗?对不起,如果我做了一些愚蠢的事情。 f
我有一个使用多处理库来计算一些东西的程序。大约有 10K 个输入需要计算,每个输入需要 0.2 秒到 10 秒的时间。 我当前的方法使用池: # Inputs signals = [list(s) f
这个starmap示例程序按预期工作: import multiprocessing def main(): pool = multiprocessing.Pool(10) param
假设我有这两种方法来完成相同的任务: from multiprocessing import Pool pool = Pool(4) def func(*args): # do some sl
关于 this post 的第二个答案, 我试过下面的代码 from multiprocessing import Pool import numpy as np from itertools imp
所以我创建了一个多处理列表(特别是 multiprocessing.Pool().starmap())并希望减少其内存大小。名单如下: import sys import numpy as np fr
在回答问题时Clunky calculation of differences between an incrementing set of numbers, is there a more beau
我正在使用 Pool 对我的程序进行多线程处理,使用 starmap 来传递参数。 我被卡住了,因为我似乎无法找到一种方法来传递 kwargs 以及我在 starmap 函数中传递的 zip 数组。
我是一名优秀的程序员,十分优秀!