Математические функции NumPy быстрее, чем у Python? - PullRequest
55 голосов
/ 06 сентября 2010

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

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

Ответы [ 3 ]

72 голосов
/ 06 сентября 2010

Вот результаты синхронизации:

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 одиночного плавающего!

25 голосов
/ 06 сентября 2010

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

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

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

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

5 голосов
/ 06 января 2014

Фактически, для массива 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...