VPython значительно медленнее в Jupyter

Я пытаюсь переписать какой-нибудь скрипт vpython в блокнотах jupyter. До сих пор я не сталкивался со многими проблемами, но последняя, ​​которую я пытался переписать, стала значительно медленнее. Он работает очень быстро в 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, или предложить какой-нибудь способ обойти это? Иначе, возможно ли, чтобы симуляция выводилась в VIDLE, а не встраивалась в записную книжку Jupyter (хотя код все еще выполнялся бы из записной книжки Jupyter)

2 ответа

Решение

Некоторые операции VPython медленнее в Jupyter, чем Classic, потому что большая часть Classic была написана на C++, тогда как Jupyter VPython реализован на Python (хотя векторный класс был Cythonized). Однако отдельная проблема заключается в том, что отправка большого количества данных из программы Python в блокнот стоит дорого, поэтому я рекомендую избавиться от trail1 и trail1.append, поскольку вы отправляете данные на каждой итерации цикла. Вместо этого, скажем, obj1 = сфера (pos= вектор (5e12,0,0), радиус =5e11, make_trail=True). Затем очки будут добавлены в след на стороне ноутбука, без необходимости что-либо отправлять в ноутбук. Вы можете также рассмотреть в качестве значения интервала установки конструктора obj1 значение, отличное от значения по умолчанию 1.

Аналогичная проблема существует для обновления obj1.pos в каждой итерации цикла. Вы отправляете 1000 обновлений obj1.pos каждую секунду по относительно узкому каналу, который проходит от сервера к браузеру. Рассмотрите возможность обновления переменной "pos" в каждой итерации, но обновляйте obj1.pos только, скажем, каждые 50 итераций.

Теперь можно запустить модуль vpython из IDLE. VPython 7 обнаруживает, что вы не работаете в ноутбуке Jupyter, и устанавливает свое собственное соединение с браузером, и в некоторых случаях это общение кажется более быстрым, чем у Jupyter. Тем не менее, я не знаю, будет ли это иметь значение в вашем случае. VIDLE (или IDLE) не может выводить 3D-анимацию.

Я буду рекламировать, что лучшее место, чтобы задавать вопросы VPython - на форуме VPython по адресу

https://groups.google.com/forum/?fromgroups&hl=en

Другие вопросы по тегам