[PYTHON] pd.tseries.offsets.DateOffset kann sehr langsam sein, wenn es nicht mit Vorsicht verwendet wird

Was ich sagen will

Es ist besser, pd.tseries.offsets.DateOffset .__ mul__ nicht zu verwenden.

Hintergrund

pandas bietet eine Klasse namens "pd.Timestamp" an, um Datums- und Uhrzeitangaben zu verarbeiten. Wenn Sie ein Datum und eine Uhrzeit berechnen möchten, die einen bestimmten Zeitraum von einem bestimmten Datum und einer bestimmten Uhrzeit entfernt sind, verwenden Sie "pd.tseries.offsets.DateOffset". Dieses Mal werde ich das interessante Verhalten von pd.tseries.offsets.DateOffset vorstellen.

Schauen Sie sich zunächst das unten stehende Ausführungsergebnis an.

$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 100 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 0.438 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 1000 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 3.85 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 10000 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 41.9 msec per loop

Weißt du was du meinst? ** Die Ausführungszeit erhöht sich linear durch Multiplikation des Datumsversatzes. ** ** ** Wahrscheinlich wird es intern so oft aufgerufen, wie "pd.Timestamp .__ add__" multipliziert wird.

Dies ist ein guter Weg, um das Gleiche zu tun.

$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*100)"  
10 loops, best of 3: 0.0328 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*1000)"   
10 loops, best of 3: 0.0373 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*10000)"
10 loops, best of 3: 0.0336 msec per loop

Es wurde hohe Geschwindigkeit (oder eher intuitives Verhalten).

Übrigens, wenn Sie das Python-Standardmodul datetime verwenden, wird es so sein. Es ist sehr schnell.

$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 100 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.0031 msec per loop
$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 1000 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.00276 msec per loop
$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 10000 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.00227 msec per loop

Recommended Posts

pd.tseries.offsets.DateOffset kann sehr langsam sein, wenn es nicht mit Vorsicht verwendet wird
Bis Sie youtube-dl mit Synology (DS120j) verwenden können
Dateitypen, die mit Go verwendet werden können
Wenn "kann beim Erstellen eines PIE-Objekts nicht verwendet werden" in make angezeigt wird
Um Japanisch mit Python in der Docker-Umgebung verwenden zu können
Hinweise zu Python-Kenntnissen, die mit AtCoder verwendet werden können
SSD 1306 OLED kann mit Raspeye + Python verwendet werden (Hinweis)
Bis Fackelgeometrie kann nur mit Windows (oder Mac) CPU verwendet werden
Kann verwendet werden, wenn aws-cli verfügbar ist, jq jedoch nicht verfügbar ist. Jp.py.
Überprüfen Sie, ob mod_wsgi erstellt werden kann
require.txt kann mit # auskommentiert werden
Akustisches Signalverarbeitungsmodul, das mit Python-Sounddevice ASIO [Anwendung] verwendet werden kann
Python-Sound Gerät ASIO akustisches Signalverarbeitungsmodul [Basic]
Linux-Befehl (Basic Edition), der ab heute verwendet werden kann, wenn Sie wissen
Mit maschinellem Lernen spielen: Kann Q-Learning bestimmen, ob marketingbezogene Maßnahmen ergriffen werden sollten?