python scipy integrate_python – 多种scipy.integrate.ode实例

本文展示了如何使用Python的multiprocessing库来加速scipy.integrate.ode的求解过程。通过创建multiprocessing.Pool并使用map函数,可以在多核处理器上并行计算,从而提高效率。实验结果显示,相比于串行计算,速度提升可达3.59倍。
摘要由CSDN通过智能技术生成

一个选择是使用

multiprocessing(即使用进程而不是线程).这是一个使用multiprocessing.Pool类的map函数的示例.

函数求解需要一组初始条件,并返回由odeint生成的解.主要部分中的“串行”版本的代码重复调用解决方案,一次为ics中的每组初始条件. “多处理”版本使用multiprocessing.Pool实例的映射函数同时运行多个进程,每个调用解决.地图函数负责处理要解决的参数.

我的电脑有四个核心,当我增加num_processes,加速最大值约3.6.

from __future__ import division, print_function

import sys

import time

import multiprocessing as mp

import numpy as np

from scipy.integrate import odeint

def 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 sol

if __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 seconds

serial: 24.756 seconds

num_processes = 5, speedup = 3.59

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值