2017-05-01 3 views
1

私は約1行の大きなcsvファイルを読んでいます。私は日付を解析することで問題に遭遇した。 Pythonは処理が遅いです。大きなファイルの解析日時を改善する方法はありますか?

ファイル内の1行は次のようになり、 '20170427,20:52:01.510,ABC,USD/MXN,1,OFFER,19.04274,9000000,[email protected]@8653948257753368229,0.0\n'

私はデータのみに目を通すならば、それは1分かかります。

t0 = datetime.datetime.now() 
i = 0 
with open(r"QuoteData.txt") as file: 
    for line in file: 
     i+=1 
print(i) 
t1 = datetime.datetime.now() - t0 
print(t1) 

129908976 
0:01:09.871744 

ただし、datetimeを解析しようとすると、8分かかります。

t0 = datetime.datetime.now() 
i = 0 
with open(r"D:\FxQuotes\ticks.log.20170427.txt") as file: 
    for line in file: 
     strings = line.split(",") 

     datetime.datetime(
      int(strings[0][0:4]), # %Y 
      int(strings[0][4:6]), # %m 
      int(strings[0][6:8]), # %d 
      int(strings[1][0:2]), # %H 
      int(strings[1][3:5]), # %M 
      int(strings[1][6:8]), # %s 
      int(strings[1][9:]), # %f 
     )  

     i+=1 
print(i) 
t1 = datetime.datetime.now() - t0 
print(t1) 

129908976 
0:08:13.687000 

split()は約1分かかり、日付の解析は、約6分かかります。これを改善するために何かできることはありますか?

+0

あなたは[gevent](http://www.gevent.org/)を見ることができます。それは、あなたが望むだけ多くのスレッド間でプロセスを分割することを可能にします。実際には、CPU/memの上限に注意してください。 – Neil

+0

日付を実際のdatetimeオブジェクトに変換する必要がありますか? – Grimmy

+0

'' '' line [:s.index( '、')] ''日付をもっと速く取得するには?各行の形式が同じ場合は、ハードコードされたインデックスをスライスするだけです。 '' line [0:8] ''です。 – Grimmy

答えて

2

@TemporalWolfは、ciso8601を使用する優れた提案を持っていました。私はそれを聞いたことがないので、私はそれを試してみるだろうと思った。

まず、ノートパソコンでベンチマークを行いました。私はその正確な行の1000万行のCSVファイルを作成し、すべてを読み取るのに約6秒かかりました。あなたの日付解析コードを使用すると、それが8倍長くかかると報告したため、それは意味をなさない48秒までになりました。その後、ファイルを100万行に縮小し、0.6秒で読み込み、4.8秒で日付を解析して、すべてが正しく見えるようにしました。

は、その後、私はciso8601に切り替えと、ほとんど魔法のように、100万行のための時間は約1.9秒まで4.8秒から行ってきました:あなたのデータはほとんど ISO8601形式で既にある

import datetime 
import ciso8601 

t0 = datetime.datetime.now() 
i = 0 
with open('input.csv') as file: 
    for line in file: 
     strings = line.split(",") 
     d = ciso8601.parse_datetime('%sT%s' % (strings[0], strings[1])) 
     i+=1 
print(i) 
t1 = datetime.datetime.now() - t0 
print(t1) 

注意。私はちょうど日付と時間を一緒に中央に "T"を貼り付ける必要があった。

+0

'' split''はまた、持続時間に15%を追加しています。彼が日付だけを調べたいならば、 '' line [0:8] '' – Grimmy

+0

csvモジュールの速度を上げることができますか? – eri

+0

%s%s "%(str1、str2)'は文字列を連結するのが遅い方法の一つです。実際、この場合、ストレート連結は速くなります: 'parse_datetime(strings [0] + '' + strings [1])'。また、 'ciso8601 import parse_datetime'は、' ciso8601.parse_datetime() 'と比較して速くなる毎回参照を参照しなくて済むようになりました。(Grimmyのように)文字列をスライスすると、他の最適化。これらの比較は**バージョンに依存しています**。 – TemporalWolf

関連する問題