J'ai essayé de comparer ces deux extraits et de voir combien d'itérations pouvaient être effectuées en une seconde. Il s'avère que Julia réalise 2,5 millions d'itérations alors que Python 4 millions. Julia n'est-elle pas censée être plus rapide. Ou peut-être que ces deux extraits ne sont pas équivalents?
Python:
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
Réponses:
C'est une sorte de comparaison de performances étrange car généralement on mesure le temps qu'il faut pour calculer quelque chose de substantiel, plutôt que de voir combien d'itérations triviales on peut faire dans un certain laps de temps. J'ai eu du mal à faire fonctionner vos codes Python et Julia, j'ai donc modifié le code Julia pour qu'il fonctionne et je n'ai tout simplement pas exécuté le code Python. Comme l'a noté @chepner dans un commentaire, l'utilisation
now()
et la comparaison de temps avec desDateTime
objets sont assez coûteuses. Latime.time()
fonction Python renvoie simplement une valeur à virgule flottante. En fait, il y a une fonction Julia appeléetime()
qui fait exactement la même chose:Voici le timing de votre
f()
fonction d' origine (modifiée pour fonctionner) sur mon système:Il a fait près de 5 millions d'itérations avant la fin du temps. Comme je l'ai dit, je n'ai pas pu faire fonctionner votre code Python sur mon système sans bidouiller (ce que je n'ai pas pris la peine de faire). Mais voici une version de
f()
cette utilisation à latime()
place, que j'appellerai avec imaginationg()
:Cette version a fait 36 millions d'itérations. Donc je suppose que Julia est plus rapide à boucler? Yay! Eh bien, en fait, le travail principal dans cette boucle est les appels à
time()
donc ... Julia est plus rapide à générer beaucoup d'time()
appels!Pourquoi est-il étrange de chronométrer cela? Comme je l'ai dit, la plupart du travail réel ici appelle
time()
. Le reste de la boucle ne fait vraiment rien. Dans un langage compilé optimisé, si le compilateur voit une boucle qui ne fait rien, il l'éliminera complètement. Par exemple:Woah, zéro seconde! Comment est-ce possible? Eh bien, regardons le code LLVM (un peu comme le code machine mais pour une machine imaginaire qui est utilisée comme représentation intermédiaire), cela diminue pour:
Le compilateur voit la boucle, découvre que le résultat est le même à chaque fois et renvoie simplement cette valeur constante au lieu d'exécuter réellement la boucle. Ce qui, bien sûr, ne prend aucun temps.
la source
Vous voulez probablement utiliser la
time_ns
fonction dans Julia:Sur mon ordinateur, il fonctionne 10 fois plus vite que Python.
la source
Eh bien, ce n'est pas ce que j'observe sur mon système:
Python 3.7.7
Julia 1.4.0:
mais notez que simplement utiliser
time
(c'est-à-dire comparer des nombres simples) est encore plus rapide:la source
time.perf_counter_ns()
en Python?time_ns
ne l' ai pas utilisétime
car il est alors 30% plus rapide.