2016-05-20 7 views
0

Ich muss alle 2-Paare Kombinationen von Elementen in einer Liste generieren. Nun, ich weiß von zwei Möglichkeiten, dies zu tun: verschachtelte for-Schleifen und Python eingebaute in itertools:Itertools vs Nested Loops Performance

from itertools import combinations 

foo = [1, 2, 3, 4] 

for i in xrange(len(foo)): 
    for j in xrange(i + 1, len(foo)): 
     print foo[i], foo[j] 

for c in combinations(foo, 2): 
    print c 

Meine Frage ist: Gibt es signifikante Vorteile zu einem über die andere verwenden?

+1

Der zweite sieht viel schöner aus und ist wahrscheinlich schneller. Sie können einfach ein Programm schreiben, um die Geschwindigkeit zu testen, setzen Sie einfach 'foo = range (1000)', um es zu einem guten Test zu machen. –

+0

'print foo [i], foo [j]' macht eigentlich nicht dasselbe wie 'print c'. Die erste Version druckt 'foo [i]' und 'foo [j]' getrennt durch ein Leerzeichen, während das zweite ein Tupel ausgibt. – user2357112

+0

@ user2357112, ich habe darüber nachgedacht; Ich habe es geändert, um ein Tupel in einer Liste zu speichern, und ich lasse es auf beiden laufen. – Teknophilia

Antwort

1

So ging ich weiter verwendet und timeit Python die Laufzeiten zu messen, die erste Schleife als @ user2357112 Modifikation vorgeschlagen:

import timeit 
from itertools import combinations 

foo = [i for i in xrange(0, 1000)]  

def loop_test(): 
    combos = [] 
    for i in xrange(len(foo)): 
     for j in xrange(i + 1, len(foo)): 
      combos.append((foo[i], foo[j]))  

def iter_test(): 
    combos = [] 
    for c in combinations(foo, 2): 
     combos.append(c)  

if __name__ == '__main__': 
    print timeit.timeit('loop_test()', setup='from __main__ import loop_test', number=1000) 
    print timeit.timeit('iter_test()', setup='from __main__ import iter_test', number=1000) 

Mit einer Leistung:

59.1836869717 
45.6625859737 

Interessanterweise scheint es, als ob iertools tatsächlich schneller ist als die verschachtelten Schleifen.