Python 如何提高scipy.sparse.csgraph.width\u一阶性能?

Python 如何提高scipy.sparse.csgraph.width\u一阶性能?,python,performance,optimization,scipy,profile,Python,Performance,Optimization,Scipy,Profile,我编写了这段代码并对其进行了分析 width\u first\u order函数花了大部分时间验证我传入的图形g。如何提高此功能的性能 有没有办法让SciPy只验证图形一次 在不更改现有代码的情况下,无需做太多工作:您已经进入验证阶段,验证所做的只是创建一个相同dtype的新csr\u矩阵,而不创建任何副本 但是,如果您的工作流中有Cython,您也可以完全跳过验证,直接转到底层方法。请注意,这样做会失去SciPy对API稳定性的承诺,并且该函数可能会在未来的版本中更改(或完全删除),而无需通知

我编写了这段代码并对其进行了分析

width\u first\u order
函数花了大部分时间验证我传入的图形
g
。如何提高此功能的性能

有没有办法让SciPy只验证图形一次


在不更改现有代码的情况下,无需做太多工作:您已经进入验证阶段,验证所做的只是创建一个相同
dtype
的新
csr\u矩阵
,而不创建任何副本

但是,如果您的工作流中有Cython,您也可以完全跳过验证,直接转到底层方法。请注意,这样做会失去SciPy对API稳定性的承诺,并且该函数可能会在未来的版本中更改(或完全删除),而无需通知

或者,如果您不介意猴子补丁,您可以简单地用标识替换导入的验证函数(再次依赖于实现细节);这有效地消除了所有验证,并确实创造了您想要的性能改进:

[2]中的
:导入scipy.sparse.csgraph
在[3]中:%timeit scipy.sparse.csgraph.width\u一阶(g,0)
每个回路34.9µs±315 ns(7次运行的平均值±标准偏差,每个10000个回路)
在[4]中:scipy.sparse.csgraph.\u traversal.validate\u graph=lambda csgraph,*args,**kwargs:csgraph
[5]中:%timeit scipy.sparse.csgraph.width\u一阶(g,0)
每个回路8.6µs±82.8 ns(7次运行的平均值±标准偏差,每个100000个回路)
如果您认为这通常是一个有用/常见的用例,您可以在上打开一个问题,请求一种跳过验证的方法。或者,在网上展开讨论

import numpy as np
from scipy.sparse import csgraph, dia_matrix

n = 1000
g = dia_matrix((np.ones(n), 1), shape=(n, n)).tocsr()
for i in range(100):
    for j in range(n):
        csgraph.breadth_first_order(g, j)