2016-11-01 75 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蟒蛇defaultdict變量,涉及數以百萬計的密鑰。

當我運行上面的循環,它運行緩慢。

蟒蛇愛好者是否有建議讓它變快?

謝謝,

+2

刪除'print'。這可能是迄今爲止代碼中最慢的部分。 – zvone

+0

但它非常非常慢。跳過一個循環需要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)) 

  • 保存其中創建新的列表每次key()電話,
  • 使用iteritems()節省一個字典查找,
  • 通過使用字符串格式化節省串分配和
  • 保存encode()調用,因爲無論如何所有輸出都在ascii範圍內。