我正在寻找一个明确的答案,以MATLAB的parfor的Python (Scipy,Numpy)。
有没有类似于parfor的解决方案?如果没有,创建一个的复杂性是什么?
更新:这是一个典型的数值计算代码,我需要提高速度
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)一个繁重的计算函数的例子是:
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]发布于 2011-01-14 00:41:25
有很多Python frameworks for parallel computing。我最喜欢的是IPython,但我对其他任何一个都不太了解。在IPython中,一种类似于解析的方法是client.MultiEngineClient.map()或the documentation on quick and easy parallelism中的一些其他结构。
发布于 2011-01-14 00:51:21
内置到python中的是multiprocessing文档是here。我使用multiprocessing.Pool时,工作者和处理器的数量总是一样多。然后,每当我需要做一个类似于for循环的结构时,我就会使用Pool.imap
只要你的函数体不依赖于之前的任何迭代,那么你就应该有近乎线性的加速。这也要求您的输入和输出是pickle-able,但对于标准类型来说,这很容易确保。
更新:更新函数的一些代码,只是为了说明它有多简单:
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发布于 2017-11-19 16:11:25
Jupyter笔记本
要查看示例,请考虑在Python中编写此Matlab代码的等价物
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)中创建一个函数,该函数包含以下内容
def func(n):
for i in range(10000):
for j in range(10000):
s=j*i
print(n)然后,我转到我的Jupyter笔记本,编写以下代码
import multiprocessing
import FunForParFor
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
pool.map(FunForParFor.func, range(10))
pool.close()
pool.join()
print('done')这对我很有效!我只是想在这里分享它,给你一个特别的例子。
https://stackoverflow.com/questions/4682429
复制相似问题