不确定是否相关,但是我将Spyder(版本3.3.3)用作Python IDE,而此python版本是3.7.3
以下是我的代码:
import os
import numpy as np
import multiprocessing as mp
from itertools import product
def func1(a_tup):
return (a_tup[0][0], *a_tup[1]), (a_tup[0][1]+a_tup[1][0])*a_tup[1][1]
if __name__ == '__main__':
lst1 = np.arange(4)
lst2 = np.arange(2, 8, 3)
lst3 = product(enumerate(lst2),
(item for item in product(lst1, lst1) if item[0] < item[1])
)
result1 = np.zeros((len(lst2), len(lst1) -1, len(lst1)), dtype = np.float32)
with mp.Pool(os.cpu_count() - 1) as pool:
mp_result1 = pool.imap(func1, lst3)#<--this line right here
for item in mp_result1:
print(item)
问题在于,一旦我运行此代码,它就会坐在那儿,永远不会完成。
我发现,只要将行mp_result1 = pool.imap(func1, lst3)
更改为mp_result1 = list(pool.imap(func1, lst3))
,编码就可以完美运行。但问题是,我正在寻找一种无需将mp_result1
转换为列表就可以使代码工作的方法,因为当生成器mp_result1
就内存使用而言足够大时,会将其转换为列表对象将立即消耗所有可用内存,从而使系统冻结。因此,绝对不是理想的情况。
这是我的问题:
如何遍历pool.imap
的结果而不先将其转换为列表对象?
提前谢谢