首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parfor for Python

Parfor for Python
EN

Stack Overflow用户
提问于 2011-01-14 00:28:55
回答 8查看 41.7K关注 0票数 54

我正在寻找一个明确的答案,以MATLAB的parfor的Python (Scipy,Numpy)。

有没有类似于parfor的解决方案?如果没有,创建一个的复杂性是什么?

更新:这是一个典型的数值计算代码,我需要提高速度

代码语言:javascript
复制
import numpy as np

N = 2000
output = np.zeros([N,N])
for i in range(N):
    for j in range(N):
        output[i,j] = HeavyComputationThatIsThreadSafe(i,j)

一个繁重的计算函数的例子是:

代码语言:javascript
复制
import scipy.optimize

def HeavyComputationThatIsThreadSafe(i,j):
    n = i * j

    return scipy.optimize.anneal(lambda x: np.sum((x-np.arange(n)**2)), np.random.random((n,1)))[0][0,0]
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-01-14 00:41:25

有很多Python frameworks for parallel computing。我最喜欢的是IPython,但我对其他任何一个都不太了解。在IPython中,一种类似于解析的方法是client.MultiEngineClient.map()the documentation on quick and easy parallelism中的一些其他结构。

票数 20
EN

Stack Overflow用户

发布于 2011-01-14 00:51:21

内置到python中的是multiprocessing文档是here。我使用multiprocessing.Pool时,工作者和处理器的数量总是一样多。然后,每当我需要做一个类似于for循环的结构时,我就会使用Pool.imap

只要你的函数体不依赖于之前的任何迭代,那么你就应该有近乎线性的加速。这也要求您的输入和输出是pickle-able,但对于标准类型来说,这很容易确保。

更新:更新函数的一些代码,只是为了说明它有多简单:

代码语言:javascript
复制
from multiprocessing import Pool
from itertools import product

output = np.zeros((N,N))
pool = Pool() #defaults to number of available CPU's
chunksize = 20 #this may take some guessing ... take a look at the docs to decide
for ind, res in enumerate(pool.imap(Fun, product(xrange(N), xrange(N))), chunksize):
    output.flat[ind] = res
票数 28
EN

Stack Overflow用户

发布于 2017-11-19 16:11:25

Jupyter笔记本

要查看示例,请考虑在Python中编写此Matlab代码的等价物

代码语言:javascript
复制
matlabpool open 4
parfor n=0:9
   for i=1:10000
       for j=1:10000
           s=j*i   
       end
   end
   n
end
disp('done')

我们可以用python写这个,特别是在jupyter notebook中。您必须在工作目录(我称之为FunForParFor.py)中创建一个函数,该函数包含以下内容

代码语言:javascript
复制
def func(n):
    for i in range(10000):
        for j in range(10000):
            s=j*i
    print(n)

然后,我转到我的Jupyter笔记本,编写以下代码

代码语言:javascript
复制
import multiprocessing  
import FunForParFor

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(FunForParFor.func, range(10))
    pool.close()
    pool.join()   
    print('done')

这对我很有效!我只是想在这里分享它,给你一个特别的例子。

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

https://stackoverflow.com/questions/4682429

复制
相关文章

相似问题

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