为什么numpy.apply_along_axis似乎比Python循环慢?

Abi*_*iel 9 python numpy

当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)
Run Code Online (Sandbox Code Playgroud)

在这里,我甚至使用内置的numpy函数,np.sum但计算sums1(Python循环)需要不到400ms而calculate sums2(apply_along_axis)需要超过2000ms(Windows上的NumPy 1.6.1).通过进一步的比较方式,R的rowMeans函数通常可以在不到20ms的时间内完成(我很确定它正在调用C代码),而类似的R函数apply()可以在大约600ms内完成.

ken*_*ytm 10

np.sum取一个axis参数,这样你就可以简单地计算总和

sums3 = np.sum(x, axis=1)
Run Code Online (Sandbox Code Playgroud)

这比你提出的两种方法快得多.

$ 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
Run Code Online (Sandbox Code Playgroud)

(至于为什么apply_along_axis更慢 - 我不知道,可能是因为该函数是用纯Python编写的,并且更通用,因此比数组版本更少的优化机会.)