2016-03-30 8 views
1

私のコードもっと速いPythonコードを書くには?

with open('data1.txt','r') as f: 
    lst = [int(line) for line in f] 

l1=lst[::3] 
l2=lst[1::3] 
l3=lst[2::3] 

print len(l1) 
print len(l2) 
print len(l3) 

b = [] 
for i in range(3200000): 
    b.append(i+1) 

print len(b) 

mapping = dict(zip(l1, b)) 
matches = [mapping[value] for value in l2 if value not in mapping] 
print matches 

は、ここでの目的マイ二つはリストを比較し、それらが同じ要素を有することが期待されるです。 が正常に動作します

3200000 
3200000 
3200000 
3200000 
[] 

しかし、問題は、コードが非常に遅く、これを改善するためにlater.How私はより多くの計算を持っているということですか? 私のpython

Python 2.7.6 
+0

どのように遅いですか?データ構造の大きさはどれくらいですか? –

+0

あなたはPython 2.xを使用していますか?そうであれば 'range'を' xrange'に変更し、 'range'はリストを作成します。 – haifzhan

+0

データの配列を扱うには[numpy](http://www.numpy.org/)を使います。 –

答えて

1

これは、メモリにに関しては効率的ではありませんが、非常に効率的な実行速度について。
l3を使用していないようです。 diffは両方のリストに含まれていないすべてを持っています。

import itertools 
with open('data1.txt','r') as f: 
    lines = map(int, f) 

l1 = itertools.islice(lines, 0, None, 3) 
l2 = itertools.islice(lines, 1, None, 3) 
diff = set(l1)^set(l2) 
0

まず、私はそれが動作する方法を見ていない:

[mapping[value] for value in l2 if value not in mapping] 

私はvaluemappingに常にあり、配列は常に空であると仮定します。キーが見つからないので、そうでなければエラーをスローするはずです。その後

、無駄なメモリ割り当てと、このような何かを試してみてください。

mapping = {} 
l2 = [] 

with open('data1.txt','r') as f: 
    for i,line in enumerate(f): 
     v = int(line) 
     if i % 3 == 0: 
      mapping[v] = i+1 
     elif i % 3 == 1: 
      l2.append(v) 

matches = [mapping[value] for value in l2 if value not in mapping] # ?? 

print(matches) 
+0

コードが機能しています。ファイル "b18.py"、行11、 matches.append(マッピング[v]) KeyError:1207 –

+0

はい、私の最初の発言のためです。私はあなたが本当に望んでいたか分からない。私が '#??'を置くステートメントを修正してください。 – JulienD

+0

もう一度問題があります。トレースバック(最近の最後のコール): ファイル "b20.py"、行10、 l2 [i] = v IndexError:リスト割り当てインデックスが範囲外にある –

関連する問題