2012-12-12 6 views
9

Ich habe versucht, ein paar schnelle Experimente zu vergleichen, die die Leistung von nativen Python-Listen mit Implementierungen von verketteten Listen wie this vergleichen.Warum hat Python keine native Implementierung einer verknüpften Liste?

Die nativen Python-Listen sind immer schneller als die nicht native verknüpfte Liste in den Fällen, in denen sie nicht sein sollten (nach der Theorie).

from linkedlist import * 
import time 
a = LinkedList() 
b = [] 
for i in range(1000000): 
    b.append(i) 
    a.add_first(i) 
t0 = time.clock() 
a.remove(10) 
t1 = time.clock() 
b.remove(10) 
t2 = time.clock() 
print t1-t0 
print t2-t1 

Die Ergebnisse, die ich auf dem Test oben haben, sind:

  • nativen verknüpften Liste = 2.00000000001e-05

  • python list = 0,005576

  • nicht nativer verkettete Liste = 3.90000000001d-05

Also habe ich mich gefragt, warum Python keine native Linked List Datenstruktur hat. Im Fall von Python sieht es für mich aus, dass es algorithmisch sinnvoll sein könnte, anstelle der Standardlisten die Verknüpfungsliste zu verwenden, um einige Aspekte der Standardbibliothek zu beschleunigen.

Mein Verständnis ist, dass die List-Datenstruktur ein Schlüsselbaustein der Sprache ist und dass sie den Code wartbarer und leicht zu optimieren macht, um sich auf genau diese Datenstruktur zu konzentrieren.

Gibt es noch einen anderen Grund?

+0

Ich sehe zwei 'print's in Ihrem Test und drei Ergebnisse - woher kommt Ihre" native "verknüpfte Liste? – Eric

+1

Ich habe die Tests mehrmals mit verschiedenen Implementierungen durchgeführt, außerdem habe ich diesen schnellen und super Dirty-Code mit swig erstellt http://cl.ly/code/2A3t352q1m1Y – lc2817

+1

Fragen Sie "Warum haben sich die Entwickler entschieden, die verkettete Liste DS auszunehmen? Python?" p.s. Ich denke, die Frage ist ein bisschen subjektiv, um in SO zu passen, vielleicht Programmers.SE? – amit

Antwort

8

Python hat collections.deque, die eine native doppelt verkettete Liste ist.

+0

Danke! Zu Ihrer Information gibt der selbe Test mit collections.deque 8.00000000001e-06 – lc2817

+6

Diese Antwort sieht falsch aus. collections.deque ist nur eine Warteschlange, auf die sowohl vom Schwanz als auch vom Kopf aus zugegriffen werden kann.Der ganze Punkt von LinkedLists besteht darin, ein Element nach einem X-Element einfügen oder ein Y-Element löschen zu können. Deque bietet diese Methoden nicht an. Die Frage von OP bleibt bestehen. Warum hat Python keine native LinkedList-Implementierung? – Mugen

+0

@Mugen hat Recht, collections.deque kann eine doppelt verknüpfte Liste unter der Haube sein (ich weiß es nicht), aber seine Schnittstelle ist nicht die einer verketteten Liste, weil es Methoden zum Einfügen und Knacken von Elementen in der Mitte fehlt die Reichweite. Obwohl es für das Testbeispiel in der Frage eine gute Lösung ist, ist collections.deque keine allgemeine Lösung für Probleme, die eine verknüpfte Liste in Python erfordern. – gregrf

0

Es ist nur weil Bau Liste dauert die meiste Zeit, anstatt Append-Methode. Wenn es sich also nicht um eine lineare Zeitoperation handelt, wie Sie gezeigt haben, ist die Methode append wichtiger als die Erstellung, die zu dem Ergebnis führt, das Sie sehen möchten.

Verwandte Themen