Optimization 一些numpy/scipy代码的优化

Optimization 一些numpy/scipy代码的优化,optimization,numpy,scipy,Optimization,Numpy,Scipy,我正在尝试优化一些python代码,它使用scipy.optimize.root进行根查找 cProfile告诉我,大多数时候程序都在计算由optimize.root调用的函数: e、 g.在80秒的总执行时间中,58秒花费在linespherecalist上,其中fun贡献了54秒(约215000次调用): 该函数包含一些基本三角函数: def lineSphericalDist(self, tt, t0, a0): x0,y0,vnn = self.fun(t0)[0

我正在尝试优化一些python代码,它使用
scipy.optimize.root
进行根查找

cProfile告诉我,大多数时候程序都在计算由
optimize.root调用的函数:
e、 g.在80秒的总执行时间中,58秒花费在
linespherecalist
上,其中
fun
贡献了54秒(约215000次调用):

该函数包含一些基本三角函数:

    def lineSphericalDist(self, tt, t0, a0):
        x0,y0,vnn = self.fun(t0)[0:3]
        beta = np.pi + t0 + a0 - vnn

        l = np.sin(beta - t0)/np.sin(beta - tt)

        x2,y2 = self.fun(tt)[0:2]
        return np.sqrt(x0**2+y0**2)*l-np.sqrt(x2**2+y2**2)
在最简单的情况下,乐趣在于:

    def fun(self,t):
        return self.r*np.cos(t),self.r*np.sin(t),np.pi/2.,np.mod(t+np.pi/2., np.pi*2.)

有没有办法加快速度(tguess已经是一个不错的起点)?我做错什么了吗?e、 g.以我在
fun
中的方式返回多个值是否是一个好主意?

如果我很好地理解您的
a0
t0
不是优化的一部分,那么您只优化了
tt
。但是,在
lineSphereCalist
中,您称self.fun(t0)。您可以在LineSphereCalist之外预先计算该数量,这将使对self的调用数量减少一半。有趣

您还可以计算
beta
,和
np.sin(beta-t0)
,以及
np.sqrt(x0**2+y0**2)
外部LineSphereCalist,只留下真正依赖于
tt
内部LineSphereCalist的位


最后,如果只使用3或2,为什么self.fun会计算4个值?这是您的瓶颈函数,让它只计算严格必需的函数…

在这种情况下,瓶颈似乎是函数
trace()
,因此您应该找到
optimize.root()
的替代方法,以提高速度。。。
    def lineSphericalDist(self, tt, t0, a0):
        x0,y0,vnn = self.fun(t0)[0:3]
        beta = np.pi + t0 + a0 - vnn

        l = np.sin(beta - t0)/np.sin(beta - tt)

        x2,y2 = self.fun(tt)[0:2]
        return np.sqrt(x0**2+y0**2)*l-np.sqrt(x2**2+y2**2)
    def fun(self,t):
        return self.r*np.cos(t),self.r*np.sin(t),np.pi/2.,np.mod(t+np.pi/2., np.pi*2.)