【问题标题】:How to parallelize a computation?如何并行计算?
【发布时间】:2019-03-19 22:11:59
【问题描述】:

我正在尝试在距离矩阵上计算普通 ODE(常微分方程),但我不知道如何并行化我的代码。

from scipy.integrate import quad
from math import exp
import numpy as np
import matplotlib.pyplot as plt

#I have my distance matrix and I wanna count how many points are distanced
# from point i with distance r at maximum 
def v(dist, r, i):
    return 1/N*(np.count_nonzero(np.select([dist[i,:]<r],[dist[i,:]]))+1)
#integral of rho from r to infinity
def rho_barre(rho, r):
    return quad(rho, r, np.inf)
# integral over r of a certain integrand
def grad_F(i, j, rho, v, v_r, dist):
    return quad(lambda r : ((v(dist, r, i)+v(dist, r, j))/2-v_r)*rho_barre(rho, max(r, dist[i,j])), 0, np.inf) 

#parameters
delta_T = 0.1
rho = (lambda x: exp(-x))
v_r =0

for t in range (1000):
    for i in range(N):
        for j in range(N):
            d_matrix[i,j] = d_matrix[i,j] + delta_T* grad_F(i,j,rho, v, v_r, d_matrix)

首先我有以下错误can't multiply sequence by non-int of type 'float',我不明白为什么。然后,我知道在 python 中三个循环太多了,我想知道如何在 Python 中让它更快。

【问题讨论】:

    标签: python numpy parallel-processing ode


    【解决方案1】:

    听起来您有几个不同的问题。让我看看我能不能回答得更抽象一些,你可以拼凑起来

    平行

    在 Python 中并行工作的一种非常简单的方法是 multiprocessing

    如果你多次应用同一个函数,而不是:

    res = [myfun(arg) for arg in args]
    

    你可以这样做:

    import multiprocessing as mp
    with mp.Pool() as pool:
        res = pool.map(myfun,args)
    

    有限制。 myfun 和 args 都必须是可腌制的(lambda 不是,所以你需要在你的代码中解决这个问题)

    嵌套循环

    一般来说,python 循环很慢。使用 NumPy 时,如果可以,最好“矢量化”。

    所以不要在d_matrix 的每个[i,j] 元素上工作,而是看看你是否可以同时处理它们。所以计算一个矩阵 grad_F(而不是一个函数)并添加它。您仍然需要您的时间循环,但您可以通过一个非常快速的操作解决您的d_matrix。

    其他提示:

    你能预计算rho_barre。也许使用scipy.integrate.cumtrapz 来计算?

    另外,尽量少写一行。使用新函数而不是 lambda。这将使您更容易理解您的代码!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多