我遇到了性能瓶颈。我正在计算大型阵列(250行和130万列)的列式意义,我在我的应用程序中这样做了一百多万次。
我在Python中的测试用例:
import numpy as np
big_array = np.random.random((250, 1300000))
%timeit mean = big_array.mean(axis = 0) # ~400 milliseconds
Numpy在我的机器上运行大约400毫秒,在单核上运行。我已经尝试了不同语言的其他几个矩阵库(Cython,R,Julia,Torch),但发现只有Julia才能击败Numpy,花费大约250毫秒。
任何人都可以提供此任务中性能大幅提升的证据吗?也许这是适合GPU的任务?
编辑:我的应用程序明显受内存限制,通过只访问一次大型数组的元素而不是重复访问,可以显着提高其性能。 (见下面的评论。)
答案 0 :(得分:9)
朱莉娅,如果我没弄错的话,在内存中使用fortran排序,而不是默认使用C内存布局的numpy。因此,如果您重新安排事物以遵循相同的布局,以便在连续的内存中发生平均值,那么您将获得更好的性能:
In [1]: import numpy as np
In [2]: big_array = np.random.random((250, 1300000))
In [4]: big_array_f = np.asfortranarray(big_array)
In [5]: %timeit mean = big_array.mean(axis = 0)
1 loop, best of 3: 319 ms per loop
In [6]: %timeit mean = big_array_f.mean(axis = 0)
1 loop, best of 3: 205 ms per loop
或者你可以改变你的尺寸并取平均值在另一个轴上:
In [10]: big_array = np.random.random((1300000, 250))
In [11]: %timeit mean = big_array.mean(axis = 1)
1 loop, best of 3: 205 ms per loop