Python 3.x Python中的多处理(从简单的Python for循环到多处理for循环)

Python 3.x Python中的多处理(从简单的Python for循环到多处理for循环),python-3.x,multiprocessing,Python 3.x,Multiprocessing,我以前从未使用过多处理模块 我有一个可以工作的python脚本。它有一个for循环,我希望通过合并多处理来提高执行速度 仅供参考:我的Cpu有8个内核,使用Ubuntu 18.04.3 LTS和Python 3.6.8 没有多重处理的代码如下所示: import math import cmath import numpy as np import matplotlib.pyplot as plt cj = cmath.sqrt(-1); Tp = 10e-6; Xc = 2e3; c = 3

我以前从未使用过多处理模块

我有一个可以工作的python脚本。它有一个for循环,我希望通过合并多处理来提高执行速度

仅供参考:我的Cpu有8个内核,使用Ubuntu 18.04.3 LTS和Python 3.6.8

没有多重处理的代码如下所示:

import math
import cmath
import numpy as np
import matplotlib.pyplot as plt

cj = cmath.sqrt(-1); Tp = 10e-6; Xc = 2e3; c = 3e8; B0 = 500e6; X0 = 50; fc = 2e9; ntarget = 8

w0 = 2 * cmath.pi * B0
wc = 2 * cmath.pi * fc
alpha = w0 / Tp
wcm = wc - alpha * Tp
Ts = (2 * (Xc - X0)) / c
Tf = (2*(Xc + X0))/c+Tp
dt = cmath.pi / (2 * alpha * Tp)
n = 2 * math.ceil(0.5 * (Tf - Ts) / dt)
t = Ts + np.arange(0, n * dt, dt)
dw = 2 * cmath.pi / (n * dt)
w = wc + dw * np.arange(-n / 2, n / 2)
x = Xc + 0.5 * c * dt * np.arange(-n / 2, n / 2)
kx = (2 * w) / c
xn = [0, 25, 35, 36.5, 40, -25, -35, -36.5]
fn = [1, 0.8, 1, 0.8, 1, 0.6, 0.9, 1]
s = np.zeros((1, n))

for i in np.arange(ntarget):
    td = t - (2 * (Xc + xn[i]) / c)
    pha = wcm * td + alpha * np.power(td, 2)
    s = s + np.multiply(fn[i] * np.exp(cj * pha), np.logical_and(td >= 0, td <= Tp))
导入数学
导入cmath
将numpy作为np导入
将matplotlib.pyplot作为plt导入
cj=cmath.sqrt(-1);Tp=10e-6;Xc=2e3;c=3e8;B0=500e6;X0=50;fc=2e9;n目标=8
w0=2*cmath.pi*B0
wc=2*cmath.pi*fc
α=w0/Tp
wcm=wc-alpha*Tp
Ts=(2*(Xc-X0))/c
Tf=(2*(Xc+X0))/c+Tp
dt=cmath.pi/(2*alpha*Tp)
n=2*数学单元(0.5*(Tf-Ts)/dt)
t=Ts+np.arange(0,n*dt,dt)
dw=2*cmath.pi/(n*dt)
w=wc+dw*np.arange(-n/2,n/2)
x=Xc+0.5*c*dt*np.arange(-n/2,n/2)
kx=(2*w)/c
xn=[0,25,35,36.5,40,-25,-35,-36.5]
fn=[1,0.8,1,0.8,1,0.6,0.9,1]
s=np.0((1,n))
对于np.arange中的i(ntarget):
td=t-(2*(Xc+xn[i])/c)
pha=wcm*td+alpha*np.功率(td,2)

s=s+np.multiply(fn[i]*np.exp(cj*pha),np.logical_和(td>=0,td=0,td感谢@0的建议。请提供一些示例,说明如何在启用OpenMp的情况下编译Numpy,并将循环转换为标准的矢量化Numpy计算。@0 0 0我已更改了代码,我的目标是在多个核中运行for loop并减少代码的执行时间。是否有任何解决方案ion?另外,我假设你的意思是专注于实际计算,而不是绘图代码(你是否真的想加速0.892秒,这在人类规模上已经很快了,这是一个有争议的问题;让我们假设这是一个测试用例).在这种情况下,请删除不必要的绘图代码,因为这会分散问题和实际基本代码的注意力。请参阅我的意思。@0感谢您的宝贵建议。是的,我想对for循环进行并行化。并利用我CPU中所有可能的核心。是的,您可以忽略不在求和循环中的变量。
def work(ntarget):
    xn = [0, 25, 35, 36.5, 40, -25, -35, -36.5]
    fn = [1, 0.8, 1, 0.8, 1, 0.6, 0.9, 1]
    s = np.zeros((1, n))
    for i in np.arange(ntarget):
        td = t - (2 * (Xc + xn[i]) / c)
        pha = wcm * td + alpha * np.power(td, 2)
        s = s + np.multiply(fn[i] * np.exp(cj * pha), np.logical_and(td >= 0, td <= Tp))


if __name__ == '__main__':
    targets = [8]
    p = Pool()
    p.map(work, targets)

    p.close()
    p.join()