Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个参数的函数的Python并行处理语法_Python_Multiprocessing_Python Multiprocessing - Fatal编程技术网

具有多个参数的函数的Python并行处理语法

具有多个参数的函数的Python并行处理语法,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,嗨,由于程序运行时间长,我目前正尝试在多个核上并行运行一个函数。我找不到多参数函数的多处理语法。我在下面附上了我的代码,不知道如何修复语法 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, delay

嗨,由于程序运行时间长,我目前正尝试在多个核上并行运行一个函数。我找不到多参数函数的多处理语法。我在下面附上了我的代码,不知道如何修复语法

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))

使用具有多个参数的函数进行多处理的一种简单语法是使用
Pool()
starmap()

为此,函数
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
然后初始化结果数组和变量:

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函数返回结果并存储结果的方式上。我不经常使用这种语法,因为我主要是在函数multiprocessing的末尾将结果存储在一个文件中


也许事先并不需要创建结果。不确定。

我尝试过,程序运行时没有任何提示end@JeffreyChiu你能分享一下你的尝试吗?我经常在相当简单的应用程序中使用这种语法。它相当有效。(还有一个输入/预期输出)@JeffreyChiu
用于范围(100200100)中的d
所以d固定在100?只需取出该范围,并在
p.starmap()之前或
之前使用
d=100
。现在,您的范围是什么
r1
r2
?如果您的代码运行时没有发出错误,那么它可能正在工作,但速度很慢。尝试将
print
语句放在函数
f
中感兴趣的位置,查看是否执行了迭代。现在我希望您确实用正确的名称替换了
f
,可能是
firstLoop
@JeffreyChiu我将用您的函数编辑我的答案,需要进行进一步的修改。@JeffreyChiu注意,进行多处理不会保留顺序。
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
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)])