Pythonのdatetime.strptimeが遅い

機械学習

結論

strptimeを使わずに、datetimeのコンストラクタを利用すれば早い。

str_datetime = "2022-01-01 00:00:00"

datetime.datetime(
    year=int(str_datetime[0:4]),
    month=int(str_datetime[5:7]),
    day=int(str_datetime[8:10]),
    hour=int(str_datetime[11:13]),
    minute=int(str_datetime[14:16]),
    second=int(str_datetime[17:19]),
)

経緯

機械学習で100万件のレコードを触っている時に、前処理の時間が長かったので計測してみた。色々問題点があったが、日付変換の処理で大きく時間がかかっていた。調べるとstrptimeを利用しないようにすれば良いとあったので実験してみた。

# strptimeを利用する
import datetime
import time

str_datetime = "2022-01-01 00:00:00"
N = 100000
start_time = time.perf_counter()

for _ in range(N):
    datetime.datetime.strptime(str_datetime, "%Y-%m-%d %H:%M:%S")

end_time = time.perf_counter()
print(end_time - start_time)

# 1.6777638220000881
# strptimeを利用しない
import datetime
import time

str_datetime = "2022-01-01 00:00:00"
N = 100000
start_time = time.perf_counter()

for _ in range(N):
    datetime.datetime(
        year=int(str_datetime[0:4]),
        month=int(str_datetime[5:7]),
        day=int(str_datetime[8:10]),
        hour=int(str_datetime[11:13]),
        minute=int(str_datetime[14:16]),
        second=int(str_datetime[17:19]),
    )

end_time = time.perf_counter()
print(end_time - start_time)

# 0.2837805259999868

処理時間が1/6ぐらいになった。

まとめ

strptimeは正規表現的な処理があるか知らないが、近いようなことをしていると思うので、遅いのは当然のような気がする。大量のデータを処理する際には有効な技だと思うので覚えておきたい。

コメント