我试图在jupyter笔记本中重写一些vpython脚本。到目前为止,我没有碰到很多问题,但是我试图改写的最后一个问题变得非常慢。它在VIDLE中运行得非常快。我在Python 3.5.0和Jupyter 4.1.0中使用了sierraOS。
代码创建一些对象,然后在while循环中更改它们的位置。
最初循环有visual.rate(5000)
,但我尝试将其减少到50但无济于事。我也尝试将对象数减少到只有两个,但仍然工作得很慢。这是我最简单的代码版本:
from vpython import scene, sphere, color, curve, arrow, mag, vector, rate,canvas
scene = canvas(width=800, height=600)
obj0 = sphere(pos=vector(0,0,0), radius=5e11)
obj1 = sphere(pos=vector(5e12,0,0), radius=5e11)
trail1= curve()
#some initial value
G = 6.7E-11
obj0.mass = 2.0E30
obj0.momentum = vector(0,0,0)
obj1.mass = 1.0E26
obj1.momentum = vector(0,0,0)
dt=200000.
CrashFlag=0
while(CrashFlag==0):
rate(1000)
obj1.force= -G*(obj0.mass*obj1.mass*obj1.pos)/(mag(obj1.pos)**3)
obj1.momentum = obj1.momentum+ dt*(obj1.force)
obj1.pos = obj1.pos + dt*obj1.momentum/obj1.mass
trail1.append(pos=obj1.pos)
if (mag(obj1.pos)<2.e11) :
CrashFlag=1
你能找到任何可能导致这种情况在Jupyter笔记本电脑中特别慢的东西,或者提出任何解决方法吗?否则,是否可以在VIDLE中输出模拟而不是在Jupyter笔记本中内联(虽然代码仍然可以从Jupyter笔记本中运行)
答案 0 :(得分:1)
一些VPython操作在Jupyter中比在Classic中慢,因为Classic的大部分都是用C ++编写的,而Jupyter VPython是用Python实现的(尽管vector类已被Cython化)。但是,一个单独的问题是将大量数据从Python程序发送到笔记本是很昂贵的,所以我建议删除trail1和trail1.append,因为你在每次循环迭代中都要发送数据。相反,假设obj1 = sphere(pos = vector(5e12,0,0),radius = 5e11,make_trail = True)。然后将点数添加到笔记本电脑侧的路径上,而无需向笔记本电脑发送任何内容。您可能还会在obj1构造函数设置间隔中考虑除默认值1以外的其他内容。
在每次循环迭代中更新obj1.pos都存在类似的问题。您通过从服务器运行到浏览器的相对较窄的管道每秒发送1000个obj1.pos更新。考虑更新变量&#34; pos&#34;在每次迭代中,但只更新obj1.pos,每50次迭代,比如说。
答案 1 :(得分:0)
现在可以从IDLE运行vpython模块了。 VPython 7检测到你没有在Jupyter笔记本中运行并与浏览器建立自己的通信,在某些情况下,这种通信似乎比Jupyter更快。但是,我不知道它是否会对你的情况产生影响。 VIDLE(或IDLE)无法输出3D动画。
我会宣传一个更好的地方来提出VPython问题是在
的VPython论坛上https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users