Я никогда раньше не использовал многопроцессорный модуль.
У меня есть скрипт Python, который работает. У него есть цикл for, который я хотел бы улучшить скоростью выполнения за счет включения многопроцессорной обработки.
К вашему сведению: мой процессор имеет 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 = 12
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, 45, 50, -25, -35, -36.5, -40, -45]
fn = [1, 0.8, 1, 0.8, 1, 0.6, 0.9, 1, 0.7, 0.8, 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))
На основе вывода 's' код продолжается.
Второй блок кода ниже "с параллельной обработкой":
Верхний код перед "def work (ntarget)" остается таким же, как и код выше.
def work(ntarget):
xn = [0, 25, 35, 36.5, 40, 45, 50, -25, -35, -36.5, -40, -45]
fn = [1, 0.8, 1, 0.8, 1, 0.6, 0.9, 1, 0.7, 0.8, 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 = [12]
p = Pool()
p.map(work, targets)
p.close()
p.join()
Первый работает нормально, но второй, хотя второй код работает без ошибок.
Время выполнения первого кода "0,892 с"
Время выполнения второго кода "0,95 с"
Я ожидаю, что код будет выполняться в нескольких ядрах длясократить время выполнения.
Что-то не так с моим многопроцессорным кодом? или мы не можем сократить время выполнения.
Заранее спасибо.