【问题标题】:Numpy optimisation - C and F_Contiguous MatricesNumpy 优化 - C 和 F_Contiguous 矩阵
【发布时间】: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 明显更快; t2t3 稍慢。我认为现代的dot/@ 有一些东西可以检测A.TA 的共同基础,并采取优化的BLAS 路线。
  • @hpaulj 明天我得看看 MKL 的速度。

标签: python numpy linear-algebra blas


【解决方案1】:

我的 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)

【讨论】:

  • 最有趣,所以它与 BLAS syrk 的使用有关,使我在引用的链接上读到的内容相当过时。
猜你喜欢
  • 2022-08-13
  • 2017-06-28
  • 2014-01-13
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多