一种选择是使用
multiprocessing(即使用进程而不是线程)。这是一个使用类
map函数的示例
multiprocessing.Pool。
该函数
solve采用一组初始条件,并返回由生成的解
odeint。主要部分中代码的“串行”版本
solve反复调用,对于中的每组初始条件一次
ics。“多重处理”版本使用实例的
map功能
multiprocessing.Pool来同时运行多个进程,每个进程都调用
solve。该
map函数负责为分配参数
solve。
我的计算机有四个核心,并且随着我的增加
num_processes,加速最大达到约3.6。
from __future__ import division, print_functionimport sysimport timeimport multiprocessing as mpimport numpy as npfrom scipy.integrate import odeintdef lorenz(q, t, sigma, rho, beta): x, y, z = q return [sigma*(y - x), x*(rho - z) - y, x*y - beta*z]def solve(ic): t = np.linspace(0, 200, 801) sigma = 10.0 rho = 28.0 beta = 8/3 sol = odeint(lorenz, ic, t, args=(sigma, rho, beta), rtol=1e-10, atol=1e-12) return solif __name__ == "__main__": ics = np.random.randn(100, 3) print("multiprocessing:", end='') tstart = time.time() num_processes = 5 p = mp.Pool(num_processes) mp_solutions = p.map(solve, ics) tend = time.time() tmp = tend - tstart print(" %8.3f seconds" % tmp) print("serial: ", end='') sys.stdout.flush() tstart = time.time() serial_solutions = [solve(ic) for ic in ics] tend = time.time() tserial = tend - tstart print(" %8.3f seconds" % tserial) print("num_processes = %i, speedup = %.2f" % (num_processes, tserial/tmp)) check = [(sol1 == sol2).all() for sol1, sol2 in zip(serial_solutions, mp_solutions)] if not all(check): print("There was at least one discrepancy in the solutions.")在我的计算机上,输出为:
multiprocessing: 6.904 secondsserial: 24.756 secondsnum_processes = 5, speedup = 3.59



