¿Son las funciones matemáticas de NumPy más rápidas que las de Python?

Tengo una función definida por una combinación de funciones matemáticas básicas (abs, cosh, sinh, exp, …).

Me preguntaba si hace una diferencia (en velocidad) para usar, por ejemplo, numpy.abs() lugar de abs() ?

Aquí están los resultados de tiempo:

 lebigot@weinberg ~ % python -m timeit 'abs(3.15)' 10000000 loops, best of 3: 0.146 usec per loop lebigot@weinberg ~ % python -m timeit -s 'from numpy import abs as nabs' 'nabs(3.15)' 100000 loops, best of 3: 3.92 usec per loop 

numpy.abs() es más lento que abs() porque también maneja matrices Numpy: contiene código adicional que proporciona esta flexibilidad.

Sin embargo, Numpy es rápido en matrices:

 lebigot@weinberg ~ % python -m timeit -s 'a = [3.15]*1000' '[abs(x) for x in a]' 10000 loops, best of 3: 186 usec per loop lebigot@weinberg ~ % python -m timeit -s 'import numpy; a = numpy.empty(1000); a.fill(3.15)' 'numpy.abs(a)' 100000 loops, best of 3: 6.47 usec per loop 

(PS: '[abs(x) for x in a]' es más lento en Python 2.7 que en el mejor map(abs, a) , que es aproximadamente un 30% más rápido, lo cual es mucho más lento que NumPy.)

Por lo tanto, ¡ numpy.abs() no toma mucho más tiempo para 1000 elementos que para 1 solo flotante!

Debería usar la función numpy para tratar con los tipos de numpy y usar la función regular de python para tratar con los tipos regulares de python.

El peor desempeño usualmente ocurre cuando se mezclan las incorporaciones de python con numpy, debido a la conversión de tipos. Estos tipos de conversión se han optimizado últimamente, pero a menudo es mejor no usarlos. Por supuesto, su millaje puede variar, así que use herramientas de perfilado para descifrarlo.

También considere el uso de progtwigs como cython o hacer un módulo en C si desea optimizar aún más su progtwig. O considera no usar python cuando las actuaciones son importantes.

pero, cuando sus datos se han colocado en una matriz numpy, entonces numpy puede ser realmente rápido en el cómputo de datos.

De hecho, en la matriz numpy

construido en abs llama a la implementación de __abs__ través de __abs__ , consulte ¿Por qué las funciones integradas como abs funcionan en una matriz numpy?

Entonces, en teoría no debería haber mucha diferencia de rendimiento.

 import timeit x = np.random.standard_normal(10000) def pure_abs(): return abs(x) def numpy_abs(): return np.absolute(x) n = 10000 t1 = timeit.timeit(pure_abs, number = n) print 'Pure Python abs:', t1 t2 = timeit.timeit(numpy_abs, number = n) print 'Numpy abs:', t2 Pure Python abs: 0.435754060745 Numpy abs: 0.426516056061