速度差np.einsum公司

2024-04-19 19:04:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到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}$

创建新阵列的速度更快。在


Tags: ofimportnumpyloopasnprandom数组
1条回答
网友
1楼 · 发布于 2024-04-19 19:04:15

einsum是用编译代码numpy/numpy/core/src/multiarray/einsum.c.src实现的。在

核心操作是使用c版本的c对所有维度进行迭代(例如,在您的例子中100*100*100次),应用由ijk字符串定义的sum-of-products计算。在

但是它会进行各种优化,包括在不需要乘法的情况下生成视图。所以需要仔细研究,看看你的情况有什么不同。在

时间分界是在不求和的情况下生成3d输出,还是在一个或多个轴上求和。在

相关问题 更多 >