2016-11-01 1 views
0

나는 그런 스크립트를 가지고있다;파이썬 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_alignments, yx_alignments, x_phrasesy_phrases 키의 수백만을 포함 파이썬 defaultdict 변수입니다.

위의 루프를 실행하면 천천히 실행됩니다.

파이썬 애호가는 빨리 할 제안이 있습니까?

감사합니다.

+2

'인쇄'를 제거하십시오. 아마도 그 코드의 가장 느린 부분 일 것입니다. – 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)) 

  • 문자열 서식을 사용하여 문자열 할당을 저장,
  • iteritems()를 사용하여 하나의 DICT 조회를 저장, 새 목록마다 시간을 만들 key() 통화를 저장하고,
  • 은 모든 출력이 ASCII 범위에 있기 때문에 encode() 호출을 저장합니다.