我注意到np.einsum
当它减少一维时会更快
import numpy as np
a = np.random.random((100,100,100))
b = np.random.random((100,100,100))
%timeit np.einsum('ijk,ijk->ijk',a,b)
# 100 loops, best of 3: 3.83 ms per loop
%timeit np.einsum('ijk,ijk->ij',a,b)
# 1000 loops, best of 3: 937 µs per loop
%timeit np.einsum('ijk,ijk->i',a,b)
# 1000 loops, best of 3: 921 µs per loop
%timeit np.einsum('ijk,ijk->',a,b)
# 1000 loops, best of 3: 928 µs per loop
这对我来说似乎很奇怪,因为我希望它首先生成新数组然后对其求和,这显然不会发生。那里发生了什么?为什么一个维度下降一个维度会变快,而另一个维度下降一个维度就不会变快?
旁注:我首先认为它与创建一个大数组有关,当它有很多维度时,我认为不是这样:
%timeit np.ones(a.shape)
# 1000 loops, best of 3: 1.79 ms per loop
%timeit np.empty(a.shape)
# 100000 loops, best of 3: 3.05 µs per loop
因为创建新数组要快得多。