答案 0 :(得分: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'
如果检查实际文件,可以看到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解释器的常量时间开销可以忽略不计。