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 по адресу