Optimization 一些numpy/scipy代码的优化
我正在尝试优化一些python代码,它使用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
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.)