Tentei comparar esses dois trechos e ver quantas iterações poderiam ser feitas em um segundo. Acontece que Julia atinge 2,5 milhões de iterações, enquanto Python, 4 milhões. Julia não deveria ser mais rápida. Ou talvez esses dois trechos não sejam equivalentes?
Pitão:
t1 = time.time()
i = 0
while True:
i += 1
if time.time() - t1 >= 1:
break
Julia:
function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Base.Dates.Millisecond(1000)
break
end
end
return i
end
Respostas:
Essa é uma espécie de comparação de desempenho estranha, pois normalmente se mede o tempo necessário para computar algo de substância, em vez de ver quantas iterações triviais se pode fazer em um determinado período de tempo. Como tive problemas para que seus códigos Python e Julia funcionassem, modifiquei o código Julia para funcionar e simplesmente não executei o código Python. Conforme observado por @chepner em um comentário, usar
now()
e fazer comparações de tempo comDateTime
objetos é bastante caro. Atime.time()
função Python apenas retorna um valor de ponto flutuante. Como se vê, há uma função Julia chamadatime()
que faz exatamente a mesma coisa:Aqui está o momento da sua
f()
função original (modificada para funcionar) no meu sistema:Ele fez quase 5 milhões de iterações antes do tempo acabar. Como eu disse, não fui capaz de executar seu código Python no meu sistema sem mexer muito (o que não me incomodei em fazer). Mas aqui está uma versão do
f()
que os usostime()
em vez disso, o que eu vou imaginativamente chamarg()
:Esta versão fez 36 milhões de iterações. Então, acho que Julia é mais rápida em fazer loop? Yay! Bem, na verdade, o principal trabalho desse loop são as chamadas para
time()
... Julia é mais rápida em gerar muitastime()
chamadas!Por que é estranho cronometrar isso? Como eu disse, a maior parte do trabalho real aqui está chamando
time()
. O resto do ciclo realmente não faz nada. Em uma linguagem compilada otimizada, se o compilador vir um loop que não faz nada, ele será eliminado completamente. Por exemplo:Uau, zero segundos! Como isso é possível? Bem, vejamos o código LLVM (tipo código de máquina semelhante, mas para uma máquina imaginária usada como representação intermediária), que reduz para:
O compilador vê o loop, descobre que o resultado é o mesmo todas as vezes e apenas retorna esse valor constante em vez de realmente executar o loop. O que, é claro, leva tempo zero.
fonte
Você provavelmente deseja usar a
time_ns
função em Julia:No meu computador, ele roda 10 vezes mais rápido que o Python.
fonte
Bem, não é isso que observo no meu sistema:
Python 3.7.7
Julia 1.4.0:
mas observe que o simples uso
time
(ou seja, comparação de números simples) é ainda mais rápido:fonte
time.perf_counter_ns()
em Python?time_ns
nãotime
como é ~ 30% mais rápido, então.