Являются ли математические функции NumPy быстрее, чем у Python?



у меня есть функция, определяемая комбинацией основных математических функций (abs, cosh, sinh, exp, ...).



мне было интересно, если это имеет значение (в скорости), чтобы использовать, например,
numpy.abs() вместо abs()?

551   3  

3 ответов:

вот результаты:

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() медленнее, чем abs(), потому что он также обрабатывает массивы numpy: он содержит дополнительный код, который обеспечивает эту гибкость.

Однако, Numpy и быстро на массивы:

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]' медленнее в Python 2.7, чем лучше map(abs, a), что примерно на 30% быстрее-что все еще намного медленнее, чем NumPy.)

таким образом, numpy.abs() не занимает намного больше времени для 1000 элементов, чем за 1 один поплавок!

вы должны использовать функции numpy для борьбы с видами библиотеки numpy и использовать обычные функции Python для борьбы с обычными типами кожи питона.

худшая производительность обычно возникает при смешивании Python builtins с numpy из-за преобразования типов. Эти преобразования типов были оптимизированы в последнее время, но по-прежнему часто лучше не использовать их. Конечно, ваш пробег может отличаться, поэтому используйте инструменты профилирования, чтобы выяснить.

также рассмотрите использование таких программ, как cython или создание C модуль, если вы хотите дополнительно оптимизировать свою программу. Или подумайте, чтобы не использовать python, когда производительность имеет значение.

но, когда ваши данные были помещены в массив numpy, то numpy может быть очень быстрым при вычислении кучу данных.

на самом деле, на массиве numpy

построен в abs вызывает реализацию numpy через __abs__ см. почему встроенные функции, такие как abs, работают на массиве numpy?

Так, в теории не должно быть большой разницы в производительности.

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

Comments

    Ничего не найдено.