Ich habe versucht, diese beiden Schnipsel zu vergleichen und zu sehen, wie viele Iterationen in einer Sekunde durchgeführt werden können. Es stellt sich heraus, dass Julia 2,5 Millionen Iterationen erreicht, Python 4 Millionen. Soll Julia nicht schneller sein? Oder sind diese beiden Schnipsel vielleicht nicht gleichwertig?
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
Antworten:
Dies ist eine Art seltsamer Leistungsvergleich, da man normalerweise die Zeit misst, die benötigt wird, um etwas Substanzielles zu berechnen, anstatt zu sehen, wie viele triviale Iterationen man in einer bestimmten Zeit durchführen kann. Ich hatte Probleme, Ihre Python- und Julia-Codes zum Laufen zu bringen, daher habe ich den Julia-Code so geändert, dass er funktioniert, und den Python-Code einfach nicht ausgeführt. Wie @chepner in einem Kommentar feststellte, ist die Verwendung
now()
und Durchführung von Zeitvergleichen mitDateTime
Objekten ziemlich teuer. Die Python-time.time()
Funktion gibt nur einen Gleitkommawert zurück. Wie sich herausstellt, gibt es eine Julia-Funktiontime()
, die genau dasselbe tut:Hier ist das Timing Ihrer ursprünglichen
f()
Funktion (geändert, um zu funktionieren) auf meinem System:Es wurden fast 5 Millionen Iterationen durchgeführt, bevor die Zeit abgelaufen war. Wie gesagt, ich konnte Ihren Python-Code nicht ohne nennenswerten Aufwand auf meinem System ausführen (was ich nicht getan habe). Aber hier ist eine Version ,
f()
dass Anwendungentime()
statt, die ich einfallsreich nenneng()
:Diese Version hat 36 Millionen Iterationen durchgeführt. Also denke ich, Julia ist schneller im Looping? Yay! Nun, eigentlich ist die Hauptarbeit in dieser Schleife das Anrufen von
time()
... Julia ist schneller darin, vieletime()
Anrufe zu generieren !Warum ist es seltsam, dies zu messen? Wie gesagt, die meiste Arbeit hier ruft an
time()
. Der Rest der Schleife macht eigentlich nichts. Wenn der Compiler in einer optimierten kompilierten Sprache eine Schleife sieht, die nichts tut, wird sie vollständig entfernt. Zum Beispiel:Woah, null Sekunden! Wie ist das möglich? Schauen wir uns das an LLVM-Code an (ähnlich wie Maschinencode, aber für eine imaginäre Maschine, die als Zwischendarstellung verwendet wird).
Der Compiler sieht die Schleife, stellt fest, dass das Ergebnis jedes Mal das gleiche ist, und gibt nur diesen konstanten Wert zurück, anstatt die Schleife tatsächlich auszuführen. Was natürlich keine Zeit in Anspruch nimmt.
quelle
Sie möchten wahrscheinlich die
time_ns
Funktion in Julia verwenden:Auf meinem Computer läuft es 10x schneller als Python.
quelle
Nun, das ist nicht das, was ich auf meinem System beobachte:
Python 3.7.7
Julia 1.4.0:
Beachten Sie jedoch, dass die einfache Verwendung
time
(dh der Vergleich einfacher Zahlen) immer noch schneller ist:quelle
time.perf_counter_ns()
in Python verwenden?time_ns
nicht verwendet,time
da es dann ~ 30% schneller ist.