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中显著击败它。这两个地方可以改进,即避免分配临时数组和并行化。