首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有多个参数的函数的Python并行处理语法

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

Stack Overflow用户
提问于 2018-07-12 01:43:30
回答 1查看 752关注 0票数 0

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

代码语言:javascript
复制
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,但不确定程序的语法。

编辑:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 01:47:55

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

代码语言:javascript
复制
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必须执行一个基本步骤。

在你的代码中:

代码语言:javascript
复制
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可以是:

代码语言:javascript
复制
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

然后我们初始化结果数组和变量:

代码语言:javascript
复制
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末尾的一个文件中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51291460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档