嗨,由于该程序的运行时间长,我目前正在尝试在多个内核上并行运行一个函数。我找不到具有多个参数的函数的多处理语法的语法。我在下面附加了我的代码,不知道如何修复语法。
import pandas as pd
import numpy as np
import numpy.random as rdm
import matplotlib.pyplot as plt
import math as m
import random as r
import time
from joblib import Parallel, delayed
def firstLoop(r1, r2, d):
count = 0
for i in range(r1):
for j in range(r2):
if(findDistance(dat1[i, 0], dat2[j, 0], dat1[i, 1], dat2[j, 1]) <= d):
count = count + 1
return count
food1 = range(r1)
atm1 = range(r2)
d = 100
num_cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=num_cores)(delayed(firstLoop)(for i in food1, for j in atm1, d))
我试图在food1和atm1中的所有元素的多个内核上运行firstLoop,但不确定程序的语法。
编辑:
startTime = time.time()
with mp.Pool(processes = mp.cpu_count()) as p:
p.starmap(f, [(x, y, d) for x in range(r1) for y in range(r2) for d in range(100, 200, 100)])
print(time.time()- startTime)
答案 0 :(得分:0)
使用具有多个参数的函数进行多处理的一种简单语法是使用Pool()
和starmap()
import multiprocessing as mp
def f(x, y):
return x+y
with mp.Pool(processes = mp.cpu_count()) as p:
p.starmap(f, [(x, y) for x in range(10) for y in range(10)])
为此,功能f
必须执行一个基本步骤。
在您的代码中:
def firstLoop(r1, r2, d):
count = 0
for i in range(r1):
for j in range(r2):
if(findDistance(dat1[i, 0], dat2[j, 0], dat1[i, 1], dat2[j, 1]) <= d):
count = count + 1
return count
基本步骤为findDistance(dat1[i, 0], dat2[j, 0], dat1[i, 1], dat2[j, 1]) <= d)
。可能的功能f
可能是:
def f(i, j, d):
if findDistance(dat1[i, 0], dat2[j, 0], dat1[i, 1], dat2[j, 1]) <= d):
return 1
else:
return 0
然后我们初始化结果数组和变量:
r1 =
r2 =
d = 100
results = np.zeros(shape=(1,r1*r2))
# Compute
with mp.Pool() as p:
results = p.starmap(f, [(i, j, d) for i in range(r1) for j in range(r2)])
然后算一下,您只需要对数组求和即可。我没有测试代码,想法在这里,但是可能需要一些修改,尤其是从map函数返回结果并存储它们的方式中。我不经常使用这种语法,因为我主要将结果存储在函数多处理结束时的文件中。
也许实际上不需要事先创建结果。不确定。