2016-11-01 5 views
0

Ich habe ein solches Skript;Optimierung für schnellere Berechnung auf 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_alignments, yx_alignments, x_phrases und y_phrases sind Python defaultdict Variablen, die Millionen von Schlüsseln beinhalten.

Wenn ich die obige Schleife starte, läuft es verdammt langsam.

Haben Python-Liebhaber einen Vorschlag, um es schnell zu machen?

Danke,

+2

Entfernen Sie die 'print'. Es ist wahrscheinlich der langsamste Teil dieses Codes bei weitem. – zvone

+0

Aber es ist sehr, sehr langsam. Es dauert 2 Sekunden, um eine Schleife zu überspringen. – yusuf

+0

Jetzt dauert es 1 Sekunde pro Schleife. Aber immer noch so schlecht. – yusuf

Antwort

2

Hier ist eine mehr idiomatische Version, die auch schneller sein sollte.

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)) 

Diese

  • speichert die key() Anrufe, die jedes Mal neue Listen erstellen,
  • speichert ein dict-Lookup durch iteritems() Verwendung
  • String Zuweisungen spart durch String-Formatierung verwenden und
  • speichert den encode() Aufruf, da alle Ausgaben sowieso im Ascii-Bereich liegen.
Verwandte Themen