結論
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は正規表現的な処理があるか知らないが、近いようなことをしていると思うので、遅いのは当然のような気がする。大量のデータを処理する際には有効な技だと思うので覚えておきたい。
コメント