我有一些代码遵循以下基本模式:
# matrices: list of matrices which represent approximations of orig
# orig: the original matrix
def gen_fxn(matrices, orig):
def H(param):
threshold(orig)
sum = 0
# iterate over all elements in all matrices to generate a sum from
# the elementwise difference from orig (the original matrix)
return sum
return H
然后我使用scipy.optimize.minimize_scalar
在某些特定范围内最小化H
。现在,现在显然限制因素是函数H
的速度。 matrices
是一个很长的列表(长度超过500)的大型矩阵(高达100,000 x 100,000)。我想以某种方式加快cython的速度。我已经在使用numpy了。我可以这样做吗?我尝试阅读有关使用cython的介绍性文献,但它并不清楚如何生成一个函数然后在其他python代码中使用,因为它似乎是加速性能的类型定义,并且那里似乎不是一个" python函数"类型。我甚至没有成功地在高性能计算群集上完成minimize_scalar
...(现在已经使用maxiter=100
,'brent'
解算器运行了大约30分钟。任何建议将不胜感激。
答案 0 :(得分:0)
根据评论中的建议,我使用了以下方法。我没有迭代缓慢的元素,而是使用了一个掩码来移除我需要的元素(我只想对对角线上方的元素进行求和 -
i < j
)在矩阵内,使用np
fxns执行减法,元素乘法,平方和矩阵内求和。与双循环方法相比,速度提高了8-10倍,N = 5000左右。