任何有效的方法来更新非常大的矩阵?

时间:2018-01-25 13:55:16

标签: python algorithm data-structures python-multiprocessing python-multithreading

我有一个非常大的矩阵,它是一个2D数组,有几百行,但大约有200万列。我的应用程序需要按行添加一个痛苦的约束来更新此矩阵行。要更新特定行,需要等待更新的前一行的所有列。而且这个过程非常缓慢。

例如:

matrix = [[0 for x in xrange(2000000)] for y in xrange(300)]
for i in xrange(1, 300):
    for j in xrange(2000000):
        k = a random column in row i-1
        matrix[i][j] = matrix[i-1][k] * simple_function(i) # some calculation
  • 要更新matrix[i][j],我需要拥有行i-1
  • 的值

我最初的想法是使用多进程方法在每个j轮中并行化i循环。但是,j循环中的计算太轻了。流程创建成本远高于计算(我也尝试了流程池)。

第二个想法是使用线程,由于GIL限制,它几乎没有性能提升。

我想知道是否有任何其他方法可以加速我的代码。谢谢。

顺便说一句,我知道Cython可以在没有GIL的情况下工作。但是计算函数需要访问Python对象,修改原始代码需要很多工作。

1 个答案:

答案 0 :(得分:0)

使用Numba执行此类任务

https://numba.pydata.org/ 如果你不是矩阵或数组创建一个(而不是列表列表)。我还建议你看看有关numpy的一些初学者教程。

示例代码:

import numpy as np
import numba as nb
import time

def main():
    matrix = np.random.rand(2000000,300)
    t1=time.time()
    k=100
    Testing(matrix,100)
    print(time.time()-t1)

@nb.jit(cache=True)
def Testing(matrix,k):
    for i in xrange(1, matrix.shape[0]):
        #inline your simple function (in my case np.power(i,2))
        res_of_func=np.power(i,2)
        for j in xrange(matrix.shape[1]):
            matrix[i,j] = matrix[i-1,k] * res_of_func

if __name__ == "__main__":
    main()

我的机器上的矩阵计算需要0.5秒(Haswell i7)。 在Python 2上与Windows上的numba并行化今天不起作用。但是jit编译的代码应该大约快100倍。