2013-05-18 17 views
5

DBまたはスプレッドシートのデータをカンマ区切りの形式で含む文字列があるとします。例えばPythonのコンマ区切り文字列から特定のフィールドのみを抽出する最速の方法

data = "hello,how,are,you,232.3354,good morning" 

は、これらの "記録" で200個のフィールドが多分あると仮定します。

私はこのレコードの特定のフィールドだけを調べることに興味があります。 Pythonの最も速い方法は何ですか?

最も簡単な方法は、ようなものになるだろう:

  1. はあなただけでリストを割り当てる必要があります。

    fields = data.split(",") 
    result = [fields[4], fields[12], fields[123]] 
    

    という事実を利用して、これを行うにはそこより高速な方法です3つの要素と3つの文字列オブジェクトを結果として返します。

  2. あなたは、フィールド123

に達すると、私は渡されたカンマをスキップするように見つけるために、繰り返し呼び出しを使用して、いくつかのコードを記述することを試みたが、最後のフィールドが、これは文字列の下遠すぎる場合は、データ列のスキャンを停止することができます基本分割ソリューションよりも遅くなります。

私は数百万のレコードを処理していますので、スピードアップを歓迎します。 resultではなく、リストのtupleすることができ

+2

ネイティブの 'str.split()'をPythonソリューションで解決するのは難しいでしょう。 –

+1

私はそれが速いかどうか分かりませんが、文字列全体を 'data.split("、 "、124)'で分割するのを避けることができます。 – chepner

+0

アプリケーションでボトルネックになっていると確信していますか?あなたのアプリのどこかにボトルネックをシフトさせるにはどれくらい早く必要ですか? – jfs

答えて

0

場合(あなたが複数のコールをやっている場合)、あなたはoperator.itemgetterを使用して高速化のビットを得るかもしれません:あなたは、実際にtimeitに必要があると思い

from operator import itemgetter 
indexer = itemgetter(4,12,123) 
result = indexer(data.split(',')) 

あなたがスピードアップを取得するかどうかを確認してください。

1

メモリにすべてをロードしてから、必要な部分を削除するよりもあまりうまくやっていないでしょう。私の推薦は、圧縮とより良いライブラリです。

私はいくつかの合理的なサイズのcsvが周りに横たわっている(これは500k行です)。

> import gzip 
> import pandas as pd 
> %timeit pd.read_csv(gzip.open('file.csv.gz')) 
1 loops, best of 3: 545 ms per loop 

また、列をドロップするのはかなり高速ですが、私は主要なコストは何か分かりません。

> %timeit csv[['col1', 'col2']] 
100 loops, best of 3: 5.5 ms per loop 
関連する問題