Уважаемые параллельные гуру на питоне,
Я разработал схему распараллеливания, основанную на функции 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
за счет вызова функции каждый раз. Кто-нибудь может предложить другие схемы распараллеливания?
Спасибо