При работе с большими данными мы также можем использовать numexpr
модуль , который поддерживает многоядерную обработку, если предполагаемые операции могут быть выражены как арифметические.Предостережение в том, что нам нужно использовать арифметические векторизованные операции.Итак, арифметическое решение для нашей задачи было бы -
(2*(temp>=0)-1)*np.sqrt(np.abs(temp))
Портировать это на numexpr
довольно просто -
import numexpr as ne
ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
Сравнительный анализ
Исходная функция-
def orgfunc(temp):
neg=temp<0
temp=numpy.abs(temp)
temp=numpy.sqrt(temp)
temp[neg]=-temp[neg]
return temp
Синхронизация больших массивов -
In [55]: np.random.seed(0)
...: m,n = 1000,1000
...: temp = np.random.randn(m,n)
In [56]: %timeit orgfunc(temp)
100 loops, best of 3: 16 ms per loop
In [57]: %timeit ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
100 loops, best of 3: 2.47 ms per loop
In [58]: np.random.seed(0)
...: m,n = 10000,10000
...: temp = np.random.randn(m,n)
In [59]: %timeit orgfunc(temp)
1 loop, best of 3: 2.09 s per loop
In [60]: %timeit ne.evaluate('(2*(temp>=0)-1)*sqrt(abs(temp))')
1 loop, best of 3: 248 ms per loop