Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用生成的函数时,如何使用cython加速scipy最小化?_Python_Performance_Numpy_Cython - Fatal编程技术网

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

Python 在使用生成的函数时,如何使用cython加速scipy最小化?,python,performance,numpy,cython,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

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

# 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
的速度<代码>矩阵是大型矩阵(高达100000 x 100000)的长列表(长度不超过500)。我想和cython一起加快速度。我已经在用numpy了。我能做这个吗?我试着阅读有关使用cython的介绍性文献,但不清楚如何生成一个函数,然后在其他python代码中使用,因为似乎是类型定义加快了性能,而且似乎没有“python函数”类型。我甚至还没有成功地在高性能计算集群上完成
minimize_scalar
。。。(现在已使用
maxiter=100
“brent”
解算器运行了约30分钟)。任何建议都将不胜感激。

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

内部的
def
函数仍然由Cython编译,并且仍然可以加速。您通常希望确保它们使用的变量是类型化的。话虽如此,这听起来像是一个问题,普通的numpy代码应该非常有效,所以您可能不会从Cython中获得很多好处。这可能有助于显示您当前的操作方式。一个包含500个元素的列表,每个元素包含一个大小为
100000 x 100000
且具有双精度的矩阵,需要至少
37
TB的内存。你确定吗?如果内存不是问题,您可以使用矢量化numpy非常有效地执行差异求和,这将和cython一样好/一样快。@romeric是的。现在我正在处理的测试数据只有大约1500 x 1500(500个元素),但代码可能会用于这种大小的矩阵。我认为在这些情况下,将使用虚拟内存。另外,当在较大的数据集上使用时,可能会以某种方式导致稀疏性。@DavidW我将检查并确保我可以共享我当前的代码,然后我会。谢谢你的回复,这正是我所怀疑的。您能推荐一个地方阅读np在后台进行的优化吗?如果您同时对整个数组进行操作(而不是在Python代码中逐个元素进行迭代),Numpy是很快的。如果您的代码看起来像
(a-orig).sum()
,那么很有可能它非常快,并且您可能不会在Cython中显著击败它。这两个地方可以改进,即避免分配临时数组和并行化。