Я считаю, что нашел лучшее решение. Идея изменить функцию на универсальную функцию python (см. документация ), которая может выполнять параллельные вычисления под капотом.
Можно написать свой собственный настроенный ufunc
на C, что, безусловно, более эффективно, или вызвав np.frompyfunc
, который является встроенным заводским методом. После тестирования это более эффективно, чем np.vectorize
:
f = lambda x, y: x * y
f_arr = np.frompyfunc(f, 2, 1)
vf = np.vectorize(f)
arr = np.linspace(0, 1, 10000)
%timeit f_arr(arr, arr) # 307ms
%timeit f_arr(arr, arr) # 450ms
Я также проверил более крупные образцы, и улучшение пропорционально. Для сравнения производительности других методов, см. этот пост