2017-04-19 26 views
1

私はPythonで何十万もの日付を処理していて、strftimeの機能がかなり遅いことに気付いています。Pythonのstrftimeより高速な代替手段がありますか?

私はチェックするためにtimeitを使いました。それは、おおよそ0.004で小数では問題ありませんが、例えば数千個の処理には問題になります。

print(min(timeit.Timer("now.strftime('%m/%d/%Y')", setup=setup).repeat(7,1000)) 

もっと速い選択肢はありますか?

これは私の箱の上にわずかに速いです
+0

私はそうは思わない。エントリが繰り返されたり、スレッドに分割されたりすると、キャッシングに行くことができます(ただし、エラーが発生しやすいです)。 – gonczor

+0

http://stackoverflow.com/questions/13468126/a-faster-strptimeこれが役立ちます。 –

+1

@AjaySingh:その質問は、文字列とタイムスタンプの関数である 'strptime'に関するものです。この質問は、タイムスタンプから文字列への関数である 'strftime'に関するものです。 – jwodder

答えて

1

はあなただけdatetimeオブジェクトの直接フィールドにアクセスし、必要な構築するための書式Pythonの文字列を使用することができます文字列:

'{:02d}/{:02d}/{}'.format(now.month, now.day, now.year) 

これは、strftime()より約4倍高速です。また、Python 2では2〜3倍高速です。

より速く再びPythonの3中には、「古い」形式の文字列の補間である:約5倍高速

'%02d/%02d/%d' % (now.month, now.day, now.year) 

が、私はこの1つは別のオプションはPython 2

ため遅くなることがわかってきましたが、唯一の1.5倍の速さ、datetime.strftime()の代わりにtime.strftime()を使用することです:

time.strftime('%m/%d/%Y', now.timetuple()) 

最後に、datetimeオブジェクトをどのように構築するのですか?文字列をdatetime(たとえば、strptime())に変換する場合、文字列スライシングを使用して着信文字列バージョンを発信文字コードに変換する方が速い場合があります。

+0

ありがとう、今これらを試してみてください。基本的に私は日時オブジェクトを持っていて、 '木曜日10:44に木曜日10時44分'のようなものを出力したいと思います。 datetimeはdbから直接得られます。 – skittles789

+0

曜日を曜日にマッピングするのは難しく、これらの代替方法が遅くなります。月の名前は同上。実際に 'datetime'オブジェクトが必要ないと仮定すると、データベースから日付を必要な形式の文字列として選択できますか? (または、あなたは両方を行うことができます: 'datetime'とそれの文字列表現を取得してください) – mhawke

+0

これは良い考えです。 – skittles789

0

(のpython 2.7.35)あなたは、剛性のフォーマットを持っているので

def fmt(date): 
    return "%02d/%02d/%d" % (date.month, date.day, date.year) 
関連する問題