【发布时间】:2020-03-23 12:54:23
【问题描述】:
http://scipy.github.io/old-wiki/pages/PerformanceTips 中关于如何获得更快的点计算的讨论让我很感兴趣。
结论点C_contiguous矩阵应该更快,并给出以下结果
import numpy as np
from time import time
N = 1000000
n = 40
A = np.ones((N,n))
AT_F = np.ones((n,N), order='F')
AT_C = np.ones((n,N), order='C')
>>> t = time();C = np.dot(A.T, A);t1 = time() - t
3.9203271865844727
>>> t = time();C = np.dot(AT_F, A);t2 = time() - t
3.9461679458618164
>>> t = time();C = np.dot(AT_C, A);t3 = time() - t
2.4167969226837158
我也试过了(Python 3.7),使用 C_contiguous 矩阵的最终计算一点也不快!
我得到以下结果
>>> t1
0.2102820873260498
>>> t2
0.4134488105773926
>>> t3
0.28309035301208496
事实证明,第一种方法是最快的。
他们和我的计算之间的差异来自哪里? 第一种情况下的转置如何不减慢计算速度?
谢谢
【问题讨论】:
-
你在 Windows 上吗?
-
macbook pro,我最快的是t3 = 0.09004902839660645
-
我得到
A是最快的。但这是一个愚蠢的比较; 1)它是单程的,变化无处不在,2)像 Windows 这样的操作系统会限制 CPU 功率以节省电量,如果有一些 CPU 密集型的东西会逐渐释放资源。使用timeit,否则辩论无意义 -
我得到了与 linux 和
timeit相同的模式(作为 OP)。t1明显更快;t2比t3稍慢。我认为现代的dot/@有一些东西可以检测A.T和A的共同基础,并采取优化的BLAS路线。 -
@hpaulj 明天我得看看 MKL 的速度。
标签: python numpy linear-algebra blas