2016-12-29 21 views
1

我試圖在jupyter筆記本中重寫一些vpython腳本。到目前爲止,我還沒遇到很多問題,但是我嘗試重寫的最後一個問題變得非常慢。它在VIDLE中運行速度非常快。我用Python 3.5.0和Jupyter 4.1.0使用sierraOS。VPython在Jupyter中顯着較慢

該代碼創建一些對象,然後在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筆記本運行)

回答

1

某些VPython操作在Jupyter中比經典版慢,因爲大部分Classic都是由在C++中,而Jupyter VPython是用Python實現的(儘管矢量類已經被Cython化了)。然而,另一個問題是從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。

0

現在可以從IDLE運行vpython模塊。 VPython 7檢測到您沒有在Jupyter筆記本上運行,並與瀏覽器建立了自己的通信,並且在某些情況下,這種通信似乎比Jupyter更快。但是,我不知道這是否會對你的情況產生影響。 VIDLE(或IDLE)無法輸出3D動畫。

我會通告一個更好的地方提出VPython問題是在VPython論壇

https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users