平方和 - np.inner首先平方,然后求和

时间:2016-06-16 15:12:22

标签: python numpy

我很惊讶,调用np.inner来计算平方和比在预先计算的正方形数组上调用np.sum快约5倍:

sum of squares code

对此行为的任何见解?我实际上对一个正方形的快速实现感兴趣,所以这些想法也是受欢迎的。

1 个答案:

答案 0 :(得分:5)

要检查实施了哪些模块np.innernp.sum,请输入

>>> np.inner.__module__
'numpy.core.multiarray'
>>> np.sum.__module__
'numpy.core.fromnumeric'
>>> np.__file__
'/Users/uweschmitt/venv_so/lib/python3.5/site-packages/numpy/__init__.py'

如果检查实际文件,可以看到numpy.core.multiarray是纯C模块,而numpy.core.fromnumeric在第二个Python函数之前首先在Python中进行一些检查和转换,然后是纯C实现调用实际总和。

我怀疑Python解释器的这一开销解释了观察到的时序差异。

为了证明我的假设,我使用更大的数组运行时间并获得

In [8]: a = np.random.random(1000000)
In [9]: %timeit np.inner(a, a)
1000 loops, best of 3: 673 µs per loop
In [10]: %timeit np.sum(a)
1000 loops, best of 3: 584 µs per loop

现在运行时间非常相似,如果重复这些语句会稍微改变一下,有时np.sum获胜,somtimes np.inner

对于大数组,np.sum的实际工作是在C中完成的,并且Python解释器的常量时间开销可以忽略不计。