Я попытался сравнить эти два фрагмента и посмотреть, сколько итераций можно выполнить за одну секунду. Оказывается, что Юлия достигает 2,5 миллиона итераций, тогда как Python 4 миллиона. Разве Джулия не должна быть быстрее? Или, может быть, эти два фрагмента не эквивалентны?
Python:
t1 = time.time()
i = 0
while True:
i += 1
if time.time() - t1 >= 1:
break
Юлия:
function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Base.Dates.Millisecond(1000)
break
end
end
return i
end
Ответы:
Это своего рода странное сравнение производительности, поскольку обычно измеряется время, необходимое для вычисления чего-то существенного, вместо того, чтобы видеть, сколько тривиальных итераций можно выполнить за определенное время. У меня были проблемы с тем, чтобы заставить работать ваши коды Python и Julia, поэтому я изменил код Julia для работы и просто не запустил код Python. Как отметил @chepner в комментарии, использование
now()
и сравнение времени сDateTime
объектами довольно дорого. Функция Pythontime.time()
просто возвращает значение с плавающей точкой. Оказывается, есть функция Julia,time()
которая делает то же самое:Вот время вашей исходной
f()
функции (модифицированной для работы) в моей системе:Он сделал почти 5 миллионов итераций, прежде чем время истекло. Как я уже сказал, я не смог заставить ваш Python-код работать в моей системе без значительных хлопот (что я и не удосужился сделать). Но вот версия,
f()
которая используетtime()
вместо этого, что я буду образно называтьg()
:Эта версия сделала 36 миллионов итераций. Значит, Джулия быстрее зацикливается? Ура! Ну, на самом деле основная работа в этом цикле - это вызовы
time()
так ... Джулия быстрее генерирует многоtime()
вызовов!Почему странно это время? Как я уже сказал, большая часть реальной работы здесь зовет
time()
. Остальная часть цикла ничего не делает. В оптимизируемом скомпилированном языке, если компилятор видит цикл, который ничего не делает, он полностью его устраняет. Например:Вау, ноль секунд! Как это возможно? Что ж, давайте посмотрим на код LLVM (вроде машинного кода, но для воображаемой машины, которая используется в качестве промежуточного представления), это понижается до:
Компилятор видит цикл, выясняет, что результат каждый раз один и тот же, и просто возвращает это постоянное значение вместо фактического выполнения цикла. Что, конечно, занимает нулевое время.
источник
Вы, вероятно, хотите использовать
time_ns
функцию в Джулии:На моем компьютере он работает в 10 раз быстрее, чем Python.
источник
Ну, это не то, что я наблюдаю в моей системе:
Python 3.7.7
Юлия 1.4.0:
но обратите внимание, что простое использование
time
(то есть сравнение простых чисел) все еще быстрее:источник
time.perf_counter_ns()
в Python?time_ns
не так,time
как на ~ 30% быстрее.