Warum ist Pythons "sortierte ()" langsamer als "Kopie, dann .sort ()"

Hier ist der Code, den ich lief:

import timeit print timeit.Timer('''a = sorted(x)''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000) print timeit.Timer('''a=x[:];a.sort()''', '''x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]''').timeit(number = 1000) 

Und hier sind die Ergebnisse:

 0.00259663215837 0.00207390190177 

Ich möchte wissen, warum mit .sort () ist konsequent schneller als sortiert (), obwohl beide Kopierlisten sind?

Anmerkung: Ich laufe Python 2.7 auf einem 2.53Ghz i5 mit Win7

  • Wie bekomme ich 2.x-ähnliches Sortierverhalten in Python 3.x?
  • Quicksort mit Python
  • Hat Python eine eingebaute Funktion für String natürliche Art?
  • Eine python-benutzerdefinierte Klasse sortierbar machen, hashable
  • Sortieren eines Python-Wörterbuchs nach dem Ausführen einer itertools-Funktion
  • Sortiere eine Liste von Tupeln alphabetisch und nach Wert
  • Python-Liste in absteigender Reihenfolge sortieren
  • Python-Quicksort - List-Verständnis vs Rekursion (Partitionsroutine)
  • 2 Solutions collect form web for “Warum ist Pythons "sortierte ()" langsamer als "Kopie, dann .sort ()"”

    Der Unterschied, den Sie betrachten, ist winzig, und geht völlig weg für längere Listen. Einfach Hinzufügen von * 1000 zur Definition von x gibt die folgenden Ergebnisse auf meiner Maschine:

     2.74775004387 2.7489669323 

    Meine beste Vermutung aus dem Grund, dass sorted() war etwas langsamer für Sie ist, dass sorted() muss einige generische Code verwenden, die beliebige iterable in eine Liste kopieren können, während das Kopieren der Liste direkt die Annahme, dass die Quelle ist auch ein Liste. Der von CPython verwendete Sortiercode ist für list.sort() und sorted() , also das ist nicht das, was den Unterschied verursacht.

    Bearbeiten : Der Quellcode der aktuellen Entwicklungsversion von sorted() macht das moralische Äquivalent von

     a = list(x) a.sort() 

    Und in der Tat, mit diesem Code anstelle von Ihrer zweiten Version eliminiert alle signifikanten Geschwindigkeitsunterschiede für alle Listengrößen.

    Zur Unterstützung von @Sven Marnachs Antwort :

    Es gibt einen kleinen Unterschied für kleine Listen:

     $ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]; s=sorted" "a=s(x)" 1000000 loops, best of 3: 1.87 usec per loop $ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]" "a=x[:];a.sort()" 1000000 loops, best of 3: 1.66 usec per loop 

    Der Unterschied geht mit * 1000 (größere Listen):

     $ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000; s=sorted" "a=s(x)" 100 loops, best of 3: 3.42 msec per loop $ python2.7 -mtimeit -s "x = [(2, 'bla'), (4, 'boo'), (3, 4), (1, 2) , (0, 1), (4, 3), (2, 1) , (0, 0)]*1000" "a=x[:];a.sort()" 100 loops, best of 3: 3.48 msec per loop 
    Python ist die beste Programmiersprache der Welt.