2016-11-01 14 views
0

私はそのようなスクリプトを持っています。pythonのより速い計算のための最適化defaultdict

for b in range(len(xy_alignments.keys())): 
       print str(b) + " : " + str(len(xy_alignments.keys())) 
       x = xy_alignments.keys()[b][0] 
       y = xy_alignments.keys()[b][1] 
       yx_prob = yx_alignments[(y,x)]/x_phrases[x] 
       xy_prob = xy_alignments[(x,y)]/y_phrases[y] 
       line_str = x + "\t" + y + "\t" + str(yx_prob) + "\t" + str(xy_prob) + "\n" 
       of.write(line_str.encode("utf-8")) 
     of.close() 

xy_alignmentsyx_alignmentsx_phrases、およびy_phrasesは、キーの数百万人が関与 のpython defaultdict変数です。

上記のループを実行すると、ゆっくりと実行されます。

python愛好家は速くするための提案がありますか?

おかげで、

+2

'print'を削除します。それはおそらくそのコードのもっとも遅い部分です。 – zvone

+0

しかし非常に遅いです。 1つのループをスキップするのに2秒かかります。 – yusuf

+0

ループごとに1秒かかる。しかしそれでもなお悪い。 – yusuf

答えて

2

ここも速くする必要がありますより多くの慣用的なバージョンは、です。

for (x, y), xy_alignment in xy_alignments.iteritems(): 
    yx_prob = yx_alignments[(y, x)]/x_phrases[x] 
    xy_prob = xy_alignment/y_phrases[y] 
    of.write(b'%s\t%s\t%s\t%s\n' % (x, y, yx_prob, xy_prob)) 

この

  • iteritems()を使用して、1件の辞書の検索を保存し
  • 、新しいリストを毎回作成key()呼び出しを保存し、
  • は、書式設定文字列を使用して、文字列の割り当てを保存し、
  • は、すべての出力がASCIIの範囲にあるため、encode()コールを保存します。
関連する問題