2016-12-01 3 views
0

私はタイムスタンプに、文字列の変換をスピードアップに取り組んでいる、と私はタイムスタンプのコンストラクタを使用すると、これを行うための絶食の方法であるように思われたことに気づいた:なぜタイムスタンプコンストラクタは日付文字列を解析する最も速い方法ですか?

import pandas as pd 
from time import perf_counter as pc 

test_time = '2016-12-01 19:44:47.891124' 

t0 = pc() 
for _ in range(100000): 
    pd.Timestamp.strptime(test_time, '%Y-%m-%d %H:%M:%S.%f') 
pc() - t0 
# 1.6517095469753258 

t0 = pc() 
for _ in range(100000): 
    pd.to_datetime(test_time) 
pc() - t0 
# 5.428138378018048 

t0 = pc() 
for _ in range(100000): 
    pd.Timestamp(test_time) 
pc() - t0 
# 0.20555895700817928 

私はコンストラクタは実際にはもっとあることを驚いていますパフォーマンスはstrptimeメソッドよりも優れています。後者では、文字列を解析する方法を明示しているためです。これらの他のアプローチよりもはるかに優れているタイムスタンプコンストラクタは何ですか?

+2

このコードは読みにくいです。おそらく、このようなものをPythonでフォーマットするべきではありません。 – byxor

+0

あなたは[それを見て](https://github.com/pandas-dev/pandas/blob/master/pandas/tslib.pyx#L249)見つけましたか?パンダはオープンソースです。 – jonrsharpe

+0

@BrandonIbbotsコードは時間のテストには十分でしたが、読みやすくするためにコードを更新しました。 –

答えて

2

使用しているプロセスが非効率的です。個々に個別に行うのではなく、一度にすべてpd.to_datetimeで一括して変換する必要があります。

は次のセットアップを考えてみましょう:

test_dts = ['2016-12-01 19:44:47.891124']*10**5 

何が本質的時に各日付の1解析しているタイミングだ:

%timeit [pd.to_datetime(dt) for dt in test_dts] 
1 loop, best of 3: 5.33 s per loop 

は、あなただけのバッチが1つのステップでそれらを変換する必要があります

%timeit pd.to_datetime(test_dts) 
10 loops, best of 3: 31.6 ms per loop 

pd.Timestampでそれぞれを個別に処理するのが遅い:

%timeit [pd.Timestamp(dt) for dt in test_dts] 
10 loops, best of 3: 166 ms per loop 
関連する問題