我注意到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
这在我看来很奇怪,因为我希望它首先生成新数组,然后对其求和,这显然没有发生。 怎么回事?为什么它变快了,当一个维度下降时,另一个维度下降后,它却没有变快?在
旁注: 我首先想到的是创建一个大数组,当它有很多维度时,我不认为是这样:
^{pr2}$创建新阵列的速度更快。在
einsum
是用编译代码numpy/numpy/core/src/multiarray/einsum.c.src
实现的。在核心操作是使用
c
版本的c
对所有维度进行迭代(例如,在您的例子中100*100*100
次),应用由ijk
字符串定义的sum-of-products
计算。在但是它会进行各种优化,包括在不需要乘法的情况下生成视图。所以需要仔细研究,看看你的情况有什么不同。在
时间分界是在不求和的情况下生成3d输出,还是在一个或多个轴上求和。在
相关问题 更多 >
编程相关推荐