VPython 在 Jupyter 中明显变慢
VPython significantly slower in Jupyter
我正在尝试在 jupyter 笔记本中重写一些 vpython 脚本。到目前为止,我还没有 运行 遇到很多问题,但我尝试重写的最后一个问题变得非常慢。它 运行 在 VIDLE 中非常快。我将 sierraOS 与 Python 3.5.0 和 Jupyter 4.1.0 一起使用。
代码创建了一些对象,然后在 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 notebook 中速度特别慢的因素吗,或者提出任何解决方法?否则,是否可以在 VIDLE 中输出模拟而不是在 Jupyter notebook 中内联(而 Jupyter notebook 中的代码仍然 运行)
Jupyter 中的一些 VPython 操作比 Classic 慢,因为 Classic 的大部分内容是用 C++ 编写的,而 Jupyter VPython 是在 Python 中实现的(尽管向量 class 已被 Cythonized)。然而,一个单独的问题是从 Python 程序向笔记本发送大量数据的成本很高,所以我建议去掉 trail1 和 trail1.append,因为你在每个循环迭代中发送数据.相反,说 obj1 = sphere(pos=vector(5e12,0,0), radius=5e11, make_trail=True)。然后点将被添加到笔记本端的轨迹中,而无需向笔记本发送任何内容。您还可以考虑在 obj1 构造函数中将间隔设置为默认值 1 以外的值。
在每次循环迭代中更新 obj1.pos 都存在类似的问题。您每秒通过从服务器到浏览器的相对较窄的管道发送 1000 obj1.pos 次更新。考虑在每次迭代中更新变量 "pos",但每 50 次迭代仅更新 obj1.pos,例如。
现在可以从 IDLE 运行 vpython 模块。 VPython 7 检测到您不在 Jupyter notebook 中 运行ning 并与浏览器建立自己的通信,在某些情况下,这种通信似乎比 Jupyter 的通信更快。但是,我不知道这是否会对您的情况产生影响。 VIDLE(或IDLE)无法输出3D动画。
我会宣传 VPython 论坛是提出 VPython 问题的更好地方
https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users
我正在尝试在 jupyter 笔记本中重写一些 vpython 脚本。到目前为止,我还没有 运行 遇到很多问题,但我尝试重写的最后一个问题变得非常慢。它 运行 在 VIDLE 中非常快。我将 sierraOS 与 Python 3.5.0 和 Jupyter 4.1.0 一起使用。
代码创建了一些对象,然后在 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 notebook 中速度特别慢的因素吗,或者提出任何解决方法?否则,是否可以在 VIDLE 中输出模拟而不是在 Jupyter notebook 中内联(而 Jupyter notebook 中的代码仍然 运行)
Jupyter 中的一些 VPython 操作比 Classic 慢,因为 Classic 的大部分内容是用 C++ 编写的,而 Jupyter VPython 是在 Python 中实现的(尽管向量 class 已被 Cythonized)。然而,一个单独的问题是从 Python 程序向笔记本发送大量数据的成本很高,所以我建议去掉 trail1 和 trail1.append,因为你在每个循环迭代中发送数据.相反,说 obj1 = sphere(pos=vector(5e12,0,0), radius=5e11, make_trail=True)。然后点将被添加到笔记本端的轨迹中,而无需向笔记本发送任何内容。您还可以考虑在 obj1 构造函数中将间隔设置为默认值 1 以外的值。
在每次循环迭代中更新 obj1.pos 都存在类似的问题。您每秒通过从服务器到浏览器的相对较窄的管道发送 1000 obj1.pos 次更新。考虑在每次迭代中更新变量 "pos",但每 50 次迭代仅更新 obj1.pos,例如。
现在可以从 IDLE 运行 vpython 模块。 VPython 7 检测到您不在 Jupyter notebook 中 运行ning 并与浏览器建立自己的通信,在某些情况下,这种通信似乎比 Jupyter 的通信更快。但是,我不知道这是否会对您的情况产生影响。 VIDLE(或IDLE)无法输出3D动画。
我会宣传 VPython 论坛是提出 VPython 问题的更好地方
https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users