2014-04-01 9 views
14

Dlaczego płytkie kopiowanie listy przy użyciu plasterka jest o wiele szybsze niż przy użyciu wbudowanego list?Dlaczego kopiowanie listy za pomocą plasterka [:] jest szybsze niż w oczywisty sposób?

In [1]: x = range(10) 

In [2]: timeit x_ = x[:] 
10000000 loops, best of 3: 83.2 ns per loop 

In [3]: timeit x_ = list(x) 
10000000 loops, best of 3: 147 ns per loop 

Zwykle, gdy widzę dziwne rzeczy, jak to, są one ustalane python3 - ale ta rozbieżność jest nadal istnieje:

In [1]: x = list(range(10)) 

In [2]: timeit x_ = x[:] 
10000000 loops, best of 3: 100 ns per loop 

In [3]: timeit x_ = list(x) 
10000000 loops, best of 3: 178 ns per loop 
+0

związane http://stackoverflow.com/questions/12537716/why-is-slice-assignment-faster-than-list-insert?rq=1 – njzk2

+0

jedno wyjaśnienie, że 'list' to funkcja musisz zadzwonić. – njzk2

+0

również lista musi robić rzeczy z każdym elementem, gdzie plasterek właśnie kopiuje blok pamięci na nowy adres ... –

Odpowiedz

9

Różnica polega na wywołaniu funkcji dodatkowej (tylko SLICE+0 vs CALL_FUNCTION 1 z dodatkowe operacje stosu):

>>> import dis 
>>> def f(lst): 
... return lst[:] 
... 
>>> def f1(lst): 
... return list(lst) 
... 
>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (lst) 
       3 SLICE+0    
       4 RETURN_VALUE   
>>> dis.dis(f1) 
    2   0 LOAD_GLOBAL    0 (list) 
       3 LOAD_FAST    0 (lst) 
       6 CALL_FUNCTION   1 
       9 RETURN_VALUE 

Od dis docs:

PLASTEREK + 0()
Narzędzie TOS = TOS [:].

(TOS - wierzchołek stosu)

CALL_FUNCTION (argc)
Wywołuje funkcję. Niski bajt argc wskazuje na liczbę parametrów pozycyjnych, a wysoki bajt na liczbę parametrów słowa kluczowego . Na stosie kod op sprawdza najpierw parametry słowa kluczowego . Dla każdego argumentu ze słowem kluczowym wartość jest nadpisywana na kluczu . Poniżej parametrów słów kluczowych znajdują się następujące parametry pozycyjne: na stosie, z najwyższym na prawo parametrem u góry. Poniżej parametrów obiekt funkcji do wywołania znajduje się na stosie. Wyrzuca wszystkie argumenty funkcji , a sama funkcja ze stosu i przekazuje wartość zwracaną.

Powiązane problemy