параллелизация альтернативы параллельным вызовам функции? - PullRequest
0 голосов
/ 10 мая 2019

Уважаемые параллельные гуру на питоне,

Я разработал схему распараллеливания, основанную на функции serial_worker:

import pathos
import multiprocessing
pool = pathos.pools.ProcessPool(ncpus=n_cores)
amps=[None,] * len(tr)  # tr is a long array
for i, _amps in enumerate(pool.map(serial_worker, tr)):
    amps[i] = _amps
pool.terminate()

Я понимаю, что при вызове функции в python возникают большие накладные расходы. Здесь я звоню serial_worker для len(tr) раз. Могу ли я отказаться от этой функции? Ниже приведена полная проблема, демонстрирующая, как я получил функцию serial_worker:

import numpy as np
import pathos  # enables pickling serial_worker
import multiprocessing

# bi and q are modest size arrays
bi = np.random.rand(42)
q = np.random.rand(10, 3)
tr = np.random.rand(10000, 42, 3)  # first dimension is very looong

def serial_worker(frame):
    """frame.shape = (42, 3)
    Uses arrays q and bi defined previously, a sort of closure 
    """
    exponents = np.tensordot(frame, q, axes=(1, 1))  # shape=(42, 10)
    exponentials = np.exp(1j * exponents)
    return np.tensordot(bi, exponentials, axes=1)  # shape=(10,)

pool = pathos.pools.ProcessPool(ncpus=n_cores)
amps=[None,] * len(tr)  # tr is a long array
for i, _amps in enumerate(pool.map(serial_worker, tr)):
    amps[i] = _amps
pool.terminate()

Я прячу q и bi в serial_worker за счет вызова функции каждый раз. Кто-нибудь может предложить другие схемы распараллеливания?

Спасибо

...