Python3 datetime ist schneller, wenn nur die Zeitzone angegeben wird

Einführung

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.

Fazit

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)

Leistungsvergleich

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.

Wenn eine Zeitzone angegeben ist

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 keine Zeitzone angeben

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.

Wenn die Zeitzone durch Pytz angegeben wird

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.

Wenn die Zeitzone in der Python2-Serie angegeben ist

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. .. .. ..

Ergebnis

Zeitzone angegeben (7s) <Zeitzone nicht angegeben (9s) <Python2 (51s) <Pytz (66s) Es wurde ein Gefühl.

Detaillierte Geschichte

Warum Pytz so langsam ist

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.

abschließend

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

Python3 datetime ist schneller, wenn nur die Zeitzone angegeben wird
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Informationen zu Python-Datums- und Zeitzone
Schnellerer Python-Release-Zyklus!
[Python] Was ist @? (Über Dekorateure)
[Python] Was ist der sortierte Schlüssel?
Wofür ist der Python-Unterstrich (_)?
Python gibt keine Fehler oder Ausgaben aus, nur weil der Einzug falsch ausgerichtet ist
Laden Sie die Datei herunter, indem Sie das Download-Ziel mit Python & Selemiun & Chrome (Windows-Version) angeben.
python So benachrichtigen Sie automatisch per Telefon, wenn das System ausfällt
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
[Python] Was wird durch Mehrfachvererbung geerbt?
[Python] Visualisieren Sie die von Wireshark erfassten Informationen
[Python] Runden Sie nur mit dem Operator ab
Wo ist der Python-Instanziierungsprozess geschrieben?
Installieren Sie, indem Sie die Version mit pip angeben
Was ist "Mahjong" in der Python-Bibliothek? ??
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei, indem Sie den Zeichencode angeben.
[Python] [Meta] Ist der Python-Typ ein Typ?
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Was ist schneller, Python Shuffle oder Sample?
Importieren Sie, indem Sie den Verzeichnispfad direkt angeben
Warum Python Slicing durch einen Doppelpunkt (:) dargestellt wird
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Was ist im Docker Python-Image pfeifend?
Sortieren Sie die Elemente eines Arrays, indem Sie Bedingungen angeben
Bachstelze ist das beste CMS für Python! (Vielleicht)
Angeben des Bereichs von Ruby- und Python-Arrays
Über den Unterschied zwischen "==" und "is" in Python
[Python] Sortieren Sie die Tabelle nach sort_values (pandas DataFrame)
BeautifulSoup-Trick: Entscheiden Sie das Tag, indem Sie den Pfad angeben
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Angeben des Modulladeziels mit GAE-Python
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
So löschen Sie die von Python ausgegebenen Zeichen
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
[Python] Vergleichen von Datum und Uhrzeit mit der hinzugefügten Zeitzone
Sortieren Sie die Liste der Tupel in Python, indem Sie die aufsteigende / absteigende Reihenfolge mehrerer Schlüssel angeben