2012-12-12 11 views
9

Próbowałem szybkiego eksperymentu porównującego wydajność natywnych list Pythona z połączonymi implementacjami list, takimi jak this.Dlaczego Python nie ma natywnej implementacji listy powiązanej?

Natywne listy pytonów są zawsze szybsze niż nieodłączna lista linków w przypadkach, w których nie powinny być (zgodnie z teorią).

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 

Wyniki mam na teście powyżej są:

  • rodzimy powiązany list = lista pyton 2.00000000001e-05

  • = 0,005576

  • non rodzimy powiązany listy = 3.90000000001e-05

Tak więc zastanawiałem się, dlaczego Python nie ma macierzystej struktury danych Linked List. W przypadku Pythona, wygląda na to, że użyteczna może być analiza algorytmiczna, aby mieć listę połączoną zamiast standardowych list, aby przyspieszyć niektóre aspekty standardowej biblioteki.

Rozumiem, że struktura danych Lista jest kluczowym elementem składowym języka, a to sprawia, że ​​kod jest łatwiejszy w utrzymaniu i łatwy do optymalizacji, aby skupić się na tej właśnie strukturze danych.

Czy jest jakikolwiek inny powód?

+0

Widzę dwa "wydruki" w teście i trzy wyniki - skąd pochodzi twoja "natywna" lista linków? – Eric

+1

Przeprowadziłem testy kilka razy z różnymi implementacjami. Również zbudowałem ten szybki i bardzo brudny kod z przekleństwem http://cl.ly/code/2A3t352q1m1Y – lc2817

+1

Pytasz "Dlaczego programiści zdecydowali się wykluczyć połączoną listę DS z pyton?" p.s. Myślę, że pytanie jest nieco subiektywne, aby dopasować się do SO, może do Programmers.SE? – amit

Odpowiedz

8

Python ma collections.deque, która jest natywną podwójnie linkowaną listą.

+0

Dzięki! Dla twojej informacji ten sam test z collections.deque daje 8.00000000001e-06 – lc2817

+6

Ta odpowiedź wygląda źle. collections.deque to tylko kolejka, do której można uzyskać dostęp zarówno od strony ogona, jak i od głowy.Cały punkt LinkedLists polega na możliwości wstawienia elementu po elemencie X lub usunięcia elementu Y. Deque nie zapewnia tych metod. Pytanie OP nadal jest prawdziwe. Dlaczego Python nie ma natywnej implementacji LinkedList? – Mugen

+0

@Mugen ma rację, collections.deque może być podwójnie połączoną listą pod maską (nie wiem), ale jej interfejs nie jest powiązany z listą, ponieważ brakuje jej metod wstawiania i otwierania elementów w środku Zakres. Więc mimo że jest to dobre rozwiązanie dla przykładu testowego w pytaniu, collections.deque nie jest ogólnym rozwiązaniem problemów, które wymagają listy połączonej w pythonie. – gregrf

0

Dzieje się tak tylko dlatego, że lista budynków zajmuje większą część czasu niż metoda dołączania. Tak więc, jeśli nie jest to liniowa operacja czasu, jak pokazałeś, (metoda: n^2) metoda append będzie bardziej znacząca niż budowa, która doprowadzi do wyniku, który chcesz zobaczyć.

Powiązane problemy