我的Python代码计算时间太长!我能用numpy更快地计算吗?如果是,怎么做?

我的Python代码计算时间太长!我能用numpy更快地计算吗?如果是,怎么做?,python,numpy,Python,Numpy,我的目标是用Verlet算法计算行星运动 问题是,代码大约需要30分钟才能完成一个完整的循环。这是基本的计算,所以我不知道为什么要花这么长时间 我在这里读了一些,使用numpy应该更快,对吗 但是我如何实现它呢?此外,它应该绕一整圈,停在0(或者2*pi*r\u earth,如果它在计算行驶距离),但它根本不停,只是继续,有人能看到我的极限为什么不起作用吗? 这是我的密码: grav = 6.673481*(10**-11) # = 6.673481e-11

我的目标是用Verlet算法计算行星运动

问题是,代码大约需要30分钟才能完成一个完整的循环。这是基本的计算,所以我不知道为什么要花这么长时间

我在这里读了一些,使用
numpy
应该更快,对吗

但是我如何实现它呢?此外,它应该绕一整圈,停在
0
(或者
2*pi*r\u earth
,如果它在计算行驶距离),但它根本不停,只是继续,有人能看到我的极限为什么不起作用吗?

这是我的密码:

grav    =   6.673481*(10**-11)             # = 6.673481e-11  # a direct way
m_sun   =   1.989*(10**30)                 # = 1.989e+30
m_earth =   5.972*(10**24)                 # = 5.972e+24    
r_earth = 149.59787*(10**9)                # = 1.4959787e+11

def verlet_v( prev_v, prev_f, mass ):

    current_v = ( prev_v + ( prev_f / mass ) )
    print "New Velocity: %f" % current_v
    return current_v

def verlet_x( prev_x, current_v ):

    current_x = prev_x + current_v
    print "New Position: %f" % current_x
    return current_x

verlet_v( 20, 50, 3 )

v = 29.8*(10**3)                          # = 2.98e+04
x = 0
f = ( -grav * ( ( m_earth * m_sun ) / r_earth**2 ) )
v_history = []
x_history = []

while( abs(x) > ( -0.1 ) ):               # ABS( <_anything_> ) is ALWAYS > -0.1

    print "Mod(x): %f" % abs(x)
    print "Limit: %f"  % (0)
    v = verlet_v( v, f, m_earth )
    x = verlet_x( x, v )
    v_history.append(v)
    x_history.append(x)

print v_history
print x_history
grav=6.673481*(10**-11)#=6.673481e-11#直接方式
孙明宇=1.989*(10**30)#=1.989e+30
m_接地=5.972*(10**24)#=5.972e+24
r_地球=149.59787*(10**9)#=1.4959787e+11
def verlet_v(上一个,上一个,质量):
当前体积=(上体积+(上体积/质量))
打印“新速度:%f”%current\u v
返回电流
def verlet_x(上一个,当前个):
当前x=上一个x+当前v
打印“新职位:%f”%current\u x
返回电流
verlet_v(20,50,3)
v=29.8*(10**3)#=2.98e+04
x=0
f=(-grav*((地球*太阳)/地球**2))
v_历史=[]
x_历史=[]
而(abs(x)>(-0.1)):#abs()始终大于-0.1
打印“模块(x):%f”%abs(x)
打印“限制:%f”%(0)
v=verlet_v(v,f,m_接地)
x=verlet_x(x,v)
v_history.append(v)
x_history.append(x)
打印v_历史记录
打印x_历史记录

你似乎陷入了一个无限循环

abs(x)
给出一个始终为正的数字的绝对值。这意味着它永远不会低于
-0.1
,因此您的while循环永远不会结束


您需要将abs(x)或
-0.1
更改为其他内容。

一个建议是定义“历史记录”数组,而不是每次迭代都将其追加。这样,就预先保留了一块内存。这将提高性能。但是,您需要提前计算出
v_历史
x_历史
的大小

例如,使用1D阵列:

v_history = np.zeros((k,))
x_history = np.zeros((k,))
其中
(k,)
是数组的形状

然后需要使用索引值将计算值存储在数组中

# outside loop
x=0

# inside loop
v_history[x] = v
x +=1

另外,你可能想开始考虑

我认为Numpy不会帮你:你需要以前的职位来计算新的职位。Numpy一次对许多变量(例如位置)进行操作,但由于只能逐个计算,因此无法同时计算所有变量。也许你可以试试Cython,但要注意的是,使用Cython可能会被扔进深渊。如果你想用你的代码计算它,请使用Everts的建议。如果你对ode的快速解决方案感兴趣,请查看并相应地重新规划你的问题。目前,你的星球只是直线加速,因此代码无法检测到某种“循环”并停止运行
:)