高性能阵列意味着

时间:2016-04-01 08:14:52

标签: python arrays numpy matrix

我遇到了性能瓶颈。我正在计算大型阵列(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的任务?

编辑:我的应用程序明显受内存限制,通过只访问一次大型数组的元素而不是重复访问,可以显着提高其性能。 (见下面的评论。)

1 个答案:

答案 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
相关问题