我有一个非常大的矩阵,它是一个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对象,修改原始代码需要很多工作。答案 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倍。