我正在寻找 MATLAB parfor for 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]
最佳答案
python 内置的一个是 multiprocessing
文档是 here .我总是使用 multiprocessing.Pool
与处理器一样多的 worker 。然后,每当我需要做一个类似 for 循环的结构时,我都会使用 Pool.imap
只要你的函数体不依赖于任何先前的迭代,那么你应该有接近线性的加速。这还要求您的输入和输出是 pickle
的,但这对于标准类型很容易确保。
更新: 更新函数的一些代码只是为了展示它是多么容易:
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
关于python - 用于 Python 的 Parfor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4682429/