2016-05-20 15 views
0

私は大きなtxtファイルを取り扱っていますが、全体的に8050000行あります。その短い行の例は次のとおりです。なぜ私のプログラムに時間がかかりますか?

usedfor zipper fasten_coat 
usedfor zipper fasten_jacket 
usedfor zipper fasten_pant 
usedfor your_foot walk 
atlocation camera cupboard 
atlocation camera drawer 
atlocation camera house 
relatedto more plenty 

私は行を読むためにPythonコードを書き、それを辞書として保存します。私のコードは次のとおりです。

dicCSK = {} 
for line in finCSK: 
    line=line.strip('\n') 
    try: 
     r, c1, c2 = line.split(" ") 
    except ValueError: print line 
    if c1 not in dicCSK.keys(): 
     dicCSK[c1]= [] 
    str1 = r+" "+c2 
    dicCSK[c1].append(str1) 

しかし、私は、20時間以上のためのプログラムを実行したそれはまだ実行されています。だから、辞書にそれらを保存するためのより良い方法はありますか?私のコードは遅すぎます。ありがとう。

+7

これは、コードレビューを求めているので、このトピックをオフトピックとして閉じるよう投票しています。したがって、http://codereview.stackexchange.comに属しています。 –

+0

その他:私はおそらく別のツール書式) - 特定のものが作成されたディクショナリと何をしようとしているかに依存した詳細。 –

+0

[2]: 'collections.defaultdict(list)'は 'dicCSK.keys()'チェックで 'c1 'の必要性を避けるでしょう。 –

答えて

5

これは間違いです。辞書内のすべてのキーのリストを生成し、それをスキャンします。代わりに

if c1 not in dicCSK.keys(): 
    dicCSK[c1]= [] 

if c1 not in dicCSK: 
    dicCSK[c1] = [] 

またはその代わりに、チェックを回避するためにdefaultdictを使用しています。

dicCSK = collections.defaultdict(list) 
for line in finCSK: 
    line=line.strip('\n') 
    try: 
     r, c1, c2 = line.split(" ") 
    except ValueError: 
     print line 
    dicCSK[c1].append(r+" "+c2) 

はまた、おそらくあなたもValueError例外があります場合でも、それ以外の場合は、実行されますtry/exceptelse条項の下でdicCSK[c1].append(r+" "+c2)声明をしたいです。

+0

あなたの答えをありがとう、それは今速いです。しかし、私のプログラムはエラーで終了しました: 'MemoryError'。私には大きなファイルが4つあるからです。これは、プログラムが2番目のファイルを処理し始めるときに発生します。 – flyingmouse

+0

私のコンピュータは8GBのメモリを持っています – flyingmouse

+0

@flyingmouse OK、別の問題のようです。この回答が満足している質問に答えた場合は、おそらくそれを受け入れて、新しい問題について新しい質問を開始してください(十分明確かつ具体的であると仮定して)。 –

関連する問題