Die Standardbibliothek für die Handhabung der Zeit in Python ist "datetime". Es ist eine Bibliothek, die problemlos verwendet werden kann, selbst wenn Sie sie ordnungsgemäß verwenden, und Sie müssen sich nicht einmal um die Leistung kümmern, wenn Sie sie nur ein wenig nennen. Wenn es jedoch erforderlich ist, Zehntausende oder Zehntausende von Daten zu generieren, wird der Engpass offensichtlich.
Daher habe ich festgestellt, dass die Leistung ein wenig verbessert werden kann, indem man auf eine kleine Sache achtet. Deshalb möchte ich sie vorstellen.
Die Schlussfolgerung ist, dass wir die Standardbibliothek "Zeitzone" verwenden werden, um "Datum / Uhrzeit" zu generieren.
Schreibe plötzlich nur noch die Schlussfolgerung. Danach prüfen Sie bitte, ob Sie interessiert sind. Ich denke, es ist besser, datetime wie folgt zu generieren. Der Punkt ist, ob "Zeitzone" angegeben werden soll. .. .. Das ist alles.
from datetime import datetime, timedelta, timezone
#Zeitzonengenerierung
JST = timezone(timedelta(hours=+9), 'JST')
# GOOD,Die Zeitzone ist angegeben. früh
datetime.now(JST)
datetime.fromtimestamp(UNIX-Zeit, JST)
# NG,Es wird eine umgebungsabhängige Zeit verwendet. Langsam im Vergleich zur Angabe einer Zeitzone
datetime.now()
datetime.fromtimestamp(UNIX-Zeit)
Ich werde sofort versuchen, "datetime" mit verschiedenen Methoden zu generieren. Messen Sie die Verarbeitungszeit, wenn "datetime" 10 Millionen Mal generiert wird. Wie stark sich die Leistung ändert, hängt davon ab, ob die Zeitzone angegeben ist oder nicht. Ich hoffe, Sie können sich darauf beziehen.
Dies ist das schnellste Muster (soweit ich weiß).
zikan1.py
from datetime import datetime, timedelta, timezone
JST = timezone(timedelta(hours=+9), 'JST')
for _ in range(10000000):
datetime.now(JST)
$ time python zikan1.py
real 0m7.581s
user 0m7.167s
sys 0m0.114s
Es durchläuft 10 Millionen Mal und das Ergebnis ist 7 Sekunden.
Wenn Sie die Zeitzone nicht angeben, ist sie etwas langsamer. Leicht. ..
zikan2.py
from datetime import datetime
for _ in range(10000000):
datetime.now()
$ time python zikan2.py
real 0m9.609s
user 0m9.149s
sys 0m0.111s
Es sind ungefähr 9 Sekunden. Es ist etwas spät.
pytz ist eine Bibliothek, mit der häufig die Zeitzone in Python2-Serien angegeben wird. Dies liegt daran, dass Python2 die Zeitzonenklasse noch nicht implementiert hat. .. ..
zikan3.py
import pytz
from datetime import datetime
# third party
JST = pytz.timezone('Asia/Tokyo')
# performance testing
for _ in range(10000000):
datetime.now(JST)
$ time python zikan3.py
real 1m9.173s
user 1m6.999s
sys 0m0.584s
Es war viel langsamer als ich erwartet hatte. Wir werden dies später diskutieren.
Da dies eine gute Idee ist, habe ich auch versucht, ein Benchmarking mit dem Python 2-System durchzuführen. Für die Python2-Serie wird nur die Schnittstellenklasse für die Zeitzone "tzinfo" bereitgestellt, sodass Sie sie selbst implementieren müssen. Langweilig. Der "Pytz" ist möglicherweise wegen der Schwierigkeiten populär geworden.
zikan4.py
from datetime import datetime, timedelta, tzinfo
class JST(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=9)
def dst(self, dt):
return timedelta(0)
def tzname(self, dt):
return 'JST'
for _ in range(10000000):
datetime.now(JST())
$ time python zikan3.py
real 0m55.416s
user 0m51.131s
sys 0m1.532s
langsam. .. .. ..
Zeitzone angegeben (7s) <Zeitzone nicht angegeben (9s) <Python2 (51s) <Pytz (66s) Es wurde ein Gefühl.
Sowohl die Zeitzonenklasse der Standardbibliothek als auch die Zeitzonenklasse von "pytz" sind Implementierungsklassen von "tzinfo". Es gibt jedoch einen Unterschied zwischen Himmel und Erde in der Leistung. Warum? Ich habe keine eindeutige Antwort gefunden, aber wenn ich sie profiliere, ist der Unterschied zwischen den beiden offensichtlich.
$ python -m cProfile -s cumtime zikan1.py
10001072 function calls (10001061 primitive calls) in 9.107 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
2/1 0.000 0.000 9.107 9.107 {built-in method builtins.exec}
1 3.149 3.149 9.107 9.107 zikan1.py:1(<module>)
10000000 5.950 0.000 5.950 0.000 {built-in method now}
3/1 0.000 0.000 0.009 0.009 <frozen importlib._bootstrap>:958(_find_and_load)
3/1 0.000 0.000 0.009 0.009 <frozen importlib._bootstrap>:931(_find_and_load_unlocked)
$ python -m cProfile -s cumtime zikan3.py
70022021 function calls (70021903 primitive calls) in 83.138 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
14/1 0.001 0.000 83.138 83.138 {built-in method builtins.exec}
1 3.185 3.185 83.138 83.138 zikan5.py:1(<module>)
10000000 9.225 0.000 79.868 0.000 {built-in method now}
10000000 17.973 0.000 70.643 0.000 tzinfo.py:179(fromutc)
20000000 43.347 0.000 43.347 0.000 {method 'replace' of 'datetime.datetime' objects}
Der Teil, auf den ich achten möchte, ist beim Ausführen von zikan3.py
10000000 17.973 0.000 70.643 0.000 tzinfo.py:179(fromutc)
20000000 43.347 0.000 43.347 0.000 {method 'replace' of 'datetime.datetime' objects}
Es ist der Teil von.
pytz wurde "datetime.replace ()" genannt und 20 Millionen Mal ausgeführt. Darüber hinaus wird die Funktion fromutc
aufgerufen.
Mit anderen Worten, der Prozess "tz.fromutc (datetime.now (). Replace (tzinfo = tz))" wird ausgeführt.
Zeit datetime in UTC generieren => datetime mit Zeitzone generieren => In Zeitzone datetime konvertieren. .. Korrekt.
Wenn andererseits die Zeitzone der Standardbibliothek als Argument angegeben wird, scheint es, dass "{integrierte Methode jetzt}" diese Seite verarbeitet, und obwohl die internen Spezifikationen unbekannt sind, scheint sie effizient zu verarbeiten. Das kann ich dir sagen.
Apropos ... Mit anderen Worten, verwenden wir die Standard-Zeitzone der Bibliothek! das ist alles!
Bitte zögern Sie nicht, auf Ungenauigkeiten wie Tippfehler hinzuweisen.
Recommended Posts