我对 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
事实证明,第一种方法是最快的。
他们和我的计算之间的这种差异从何而来? 在第一种情况下,转置如何不减慢计算速度?
谢谢
我的 linux/timeit 时间:
In [122]: timeit A.T@A
258 ms ± 523 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [123]: timeit AT_F@A
402 ms ± 2.66 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [124]: timeit AT_C@A
392 ms ± 9.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [125]: %%timeit x=A.T.copy(order='F')
...: x@A
410 ms ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)