使用Python';s multiprocessing.pool.imap

使用Python';s multiprocessing.pool.imap,python,Python,我试图用Python执行一些昂贵的科学计算。我已经将一个数据集读入一个列表(data\u list),其中包含18个元素,每个元素也是一个包含1500000整数的列表。 现在,我想在列表中的每对数据之间进行一些计算(数据列表)。由于每个进程都需要很长时间,而且我有大约8个处理器要使用,因此我尝试使用多处理中的池方法 def calc_func(args): # do some calculation, and return result and score # len(_res)

我试图用Python执行一些昂贵的科学计算。我已经将一个数据集读入一个列表(data\u list),其中包含18个元素,每个元素也是一个包含1500000整数的列表。 现在,我想在列表中的每对数据之间进行一些计算(数据列表)。由于每个进程都需要很长时间,而且我有大约8个处理器要使用,因此我尝试使用多处理中的方法

def calc_func(args):
    # do some calculation, and return result and score
    # len(_res) == 1500000
    return _res, score


count = len(data_list)
pairs = [(i, j, data_list[i], data_list[j]) for i in range(0, count - 1) for j in range(i + 1, count)]
chunk_size, extra = divmod(len(pairs), 4 * 8)
if extra:
    chunk_size += 1
pool = Pool(8)
res = pool.imap(calc_func, pairs, chunksize=chunk_size)
pool.close()
pool.join()
然后,我按照得分对结果列表进行排序,并将第一个结果添加到数据列表中

res.sort(key=lambda e: e[2], reverse=True) 
data_list.append(res.pop(0))
然后,在数据列表中只追加一个与另一个之间进行计算,并将计算结果中的第一个追加到按分数排序的数据列表。此处理需要重复60次

loop = 0
while loop <= 60:
    loop += 1
    count = len(data_list)
    j = count - 1
    pairs = [(i, j, data_list[i], data_list[j]) for i in range(j)]
    chunk_size, extra = divmod(len(pairs), 4 * 8)
    if extra:
        chunk_size += 1
    pool = Pool(8)
    res = pool.imap(calc_func, pairs, chunksize=chunk_size)
    pool.close()
    pool.join()
    res.sort(key=lambda e: e[2], reverse=True) 
    data_list.append(res.pop(0))
loop=0

虽然我确实没有使用过这种数据,但是看起来库
numpy
scipy
可能有用吗?不知道,真的(只是想在这里抛出一些想法)看起来你正在试图获得最大的项目。不要使用
sort()
,而是使用
max()
。“这要有效得多。”博拉贾克斯谢谢你的建议。calc_func用于在两个列表(长度为1500000)的每对元素之间进行异或运算,然后结果列表也有1500000个元素。我应该如何使用
numpy
scipy
。res是一个列表[([…],score),…],我需要得到最大分数的元组。感谢您的建议,我将使用max()替换sort()。我确实没有处理过此类数据,但是库
numpy
scipy
可能有用吗?不知道,真的(只是想在这里抛出一些想法)看起来你正在试图获得最大的项目。不要使用
sort()
,而是使用
max()
。“这要有效得多。”博拉贾克斯谢谢你的建议。calc_func用于在两个列表(长度为1500000)的每对元素之间进行异或运算,然后结果列表也有1500000个元素。我应该如何使用
numpy
scipy
。res是一个列表[([…],score),…],我需要得到最大分数的元组。谢谢你的建议,我将使用max()替换sort()