使用生成函数时如何使用cython加速scipy最小化?

时间:2017-05-23 17:14:50

标签: python performance numpy cython

我有一些代码遵循以下基本模式:

# 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分钟。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据评论中的建议,我使用了以下方法。我没有迭代缓慢的元素,而是使用了一个掩码来移除我需要的元素(我只想对对角线上方的元素进行求和 -  i < j)在矩阵内,使用np fxns执行减法,元素乘法,平方和矩阵内求和。与双循环方法相比,速度提高了8-10倍,N = 5000左右。