我很惊讶,调用np.inner计算平方和比调用np.sum预先计算的正方形数组快5倍:
对此行为的任何见解?我实际上对一个正方形的快速实现感兴趣,所以这些想法也是受欢迎的.
要检查我键入的模块np.inner和np.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'
Run Code Online (Sandbox Code Playgroud)
如果您检查实际文件,您可以看到它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
Run Code Online (Sandbox Code Playgroud)
现在运行时间非常相似,如果重复这些语句,有时会np.sum获胜,有时会有所改变np.inner.
对于大数组,实际工作np.sum是在C中完成的,并且Python解释器的常量时间开销可以忽略不计.