Я адаптировал простую программу для вычисления и построения вихрей перемещения для Julia для проверки языка, я также написал его на Python без особых причин.
(Отказ от ответственности: 1. Каждое сравнение производительности в stackoverflow, которое я прочитал, захлопнулось за то, что оно не было полным/правильным/хорошо написанным/релевантным и т.д. и т.д. - я не притворяюсь, что это реальное сравнение, я бы просто как узнать, как сделать Julia быстрее. 2. Я знаю, что python может быть оптимизирован, реализован в Cython и т.д., который не является частью этого обсуждения, он просто здесь для ссылки на эквивалентные функции в Julia и Python.)
Код и результаты работы можно увидеть в сущности.
Производительность Julia значительно медленнее Fortran. Время, затраченное на выполнение самого расчета, составляет (50000 временных шагов):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Юлия намного медленнее (~ 44 раза медленнее), чем Fortran, разрыв сужается, но по-прежнему значителен с 10-кратным шагом времени (0.50s vs 15.24s
).
Эти результаты существенно отличаются от результатов, представленных на домашней странице julia. Что я делаю не так? Могу ли я исправить Юлию значительно быстрее?
Я прочитал страницу Julia Performance Tips и код сравнения на домашней странице Julia, и мне ничего не стоит исправлять.
Также интересно, что Julia очень медленно загружает PyPlot (5secs
ish!!) и намного медленнее, чем Python, чтобы читать текстовый файл. Могу ли я сделать что-нибудь, чтобы улучшить эти вещи?
Обратите внимание, что приведенные выше времена не показывают время загрузки для Julia и Python, это просто время, затраченное на вычисление AFAIK - см. код. Для фортран это все. Графическое изображение было отключено, грубо, в каждом случае, чтобы обеспечить сравнение скорости.
Компьютер: Intel i7-3770, 16GB RAM, SSD HD, ОС: Ubuntu 13.10 64bit., Fortran: gfortran, GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1, Julia: версия 0.3.0- preerelease + 396 (2013-12-12 00:18 UTC), Commit c5364db * (мастер 0 дней), x86_64-linux-gnu, Python: 2.7.5 +
Обновление:
Основываясь на совете ivarne, я переписал Julia script (обновленный в gist выше): инкапсулируя работу grunt в функции, объявляя тип всего и разбивая различные элементы матриц на разные массивы, где это применимо. (Я включил Float64 в довольно нескольких местах, так как я попытался Float32, чтобы увидеть, помогло ли это, это было не в большинстве случаев).
Результаты следующие:
50,000
временные шаги:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
500,000
временные шаги:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, calc. and return (?): 2.094s, total exec.: 8.521s
В заключение:
-
Вы можете немного ускорить Джулию.
-
Вы можете существенно повлиять на кажущуюся скорость Julia в зависимости от того, как вы измеряете ее производительность.