Почему numpy.apply_along_axis кажется медленнее, чем цикл Python? - PullRequest
9 голосов
/ 28 декабря 2011

Я запутался, когда функция numpy numpy.apply_along_axis() превзойдет простой цикл Python.Например, рассмотрим случай матрицы с множеством строк, и вы хотите вычислить сумму каждой строки:

x = np.ones([100000, 3])
sums1 = np.array([np.sum(x[i,:]) for i in range(x.shape[0])])
sums2 = np.apply_along_axis(np.sum, 1, x)

Здесь я даже использую встроенную функцию numpy, np.sum, иоднако вычисление sums1 (цикл Python) занимает менее 400 мс, а вычисление sums2 (apply_along_axis) - более 2000 мс (NumPy 1.6.1 в Windows).При дальнейшем сравнении R-функция rowMeans часто может сделать это менее чем за 20 мс (я уверен, что она вызывает код C), тогда как аналогичная функция R apply() может сделать это примерно за 600 мс.

1 Ответ

10 голосов
/ 28 декабря 2011

np.sum принимает параметр axis, чтобы вы могли вычислить сумму, просто используя

sums3 = np.sum(x, axis=1)

Это намного быстрее, чем 2 метода, которые вы задали.

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.apply_along_axis(np.sum, 1, x)"
1 loops, best of 1: 3.21 sec per loop

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.array([np.sum(x[i,:]) for i in range(x.shape[0])])"
1 loops, best of 1: 712 msec per loop

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.sum(x, axis=1)"
1 loops, best of 1: 1.81 msec per loop

(Что касается того, почему apply_along_axis медленнее - я не знаю, вероятно, потому что функция написана на чистом Python и гораздо более универсальна и, следовательно, имеет меньше возможностей для оптимизации, чем версия массива.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...