Математика NumPy работает быстрее, чем Python?

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

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

Ответ 1

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

[email protected] ~ % python -m timeit 'abs(3.15)' 
10000000 loops, best of 3: 0.146 usec per loop

[email protected] ~ % 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 быстро работает на массивах:

[email protected] ~ % python -m timeit -s 'a = [3.15]*1000' '[abs(x) for x in a]'
10000 loops, best of 3: 186 usec per loop

[email protected] ~ % 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 элементов, чем для одного одиночного float!

Ответ 2

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

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

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

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

Ответ 3

Фактически, в массиве 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

Ответ 4

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

Случай 1: два DataFrames размера (10,5)

NumPy выигрывает против обоих.

введите описание изображения здесь

Случай 2: два DataFrames размера (10000,5)

... и выигрывает против обоих здесь.

введите описание изображения здесь

Случай 3: два DataFrames размера (1e6,5)

Но, NumPy в конечном итоге проигрывает на скорости как для родного Python, так и для pandas с входами в 1 миллион строк:

введите описание изображения здесь

Третий результат удивителен.

Примечание:

Все эти тесты выполняли операции с двумя случайными np.ndarrays указанного размера, то есть a = DataFrame(np.random.randn(10,5)) и b = DataFrame(np.random.randn(10,5)). Операциями будут, например,

  • %timeit np.add(a, b)
  • %timeit a + b
  • %timeit a.add(b)