Многопроцессорная обработка в Python (переход от простого Python для цикла к многопроцессорной обработке цикла) - PullRequest
0 голосов
/ 29 октября 2019

Я никогда раньше не использовал многопроцессорный модуль.

У меня есть скрипт 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 с"

Я ожидаю, что код будет выполняться в нескольких ядрах длясократить время выполнения.

Что-то не так с моим многопроцессорным кодом? или мы не можем сократить время выполнения.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...