【发布时间】:2018-08-06 00:38:23
【问题描述】:
我正在尝试优化一些执行大量顺序矩阵运算的代码。
我认为numpy.linalg.multi_dot (docs here) 会在 C 或 BLAS 中执行所有操作,因此它会比使用 arr1.dot(arr2).dot(arr3) 等更快。
我真的很惊讶在笔记本上运行这段代码:
v1 = np.random.rand(2,2)
v2 = np.random.rand(2,2)
%%timeit
v1.dot(v2.dot(v1.dot(v2)))
The slowest run took 9.01 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.14 µs per loop
%%timeit
np.linalg.multi_dot([v1,v2,v1,v2])
The slowest run took 4.67 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 32.9 µs per loop
使用multi_dot 发现相同的操作大约慢了 10 倍。
我的问题是:
- 我错过了什么吗?这有意义吗?
- 还有其他方法可以优化顺序矩阵运算吗?
- 我应该期待使用 cython 的相同行为吗?
【问题讨论】:
-
那个数据太小了。 multidot 有一些设置阶段来优化排序。当然,这只有通过更大的数据才能得到回报。 (并且 dot 也使用 BLAS,如下所示:multidotchain np.dot)
标签: python performance numpy cython