2014-04-01 24 views
14

Neden bir dilim kullanarak bir listeyi list yerleşiğinden çok daha hızlı sığdırıyor? Böyle garip şeyler görünceNeden bir listeyi [:] kullanarak bariz bir şekilde daha hızlı bir şekilde kopyalıyorsunuz?

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 

Genellikle, onlar python3 sabit konum - ama bu tutarsızlık hala:

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

ilgili http://stackoverflow.com/questions/12537716/why-is-slice-assignment-faster-than-list-insert?rq=1 için – njzk2

+0

bir açıklama list 'bir fonksiyondur 'olduğunu çok araman gerek. – njzk2

+0

listesi de her bir öğeyle ilgili bir şeyler yapmaya ihtiyaç duyuyor, bir dilim sadece bir bellek bloğunu yeni bir adrese kopyalarken ... –

cevap

9

fark ek işlev çağrısı (CALL_FUNCTION 1 vs sadece SLICE+0 ile içindedir ekstra yığın işlemleri): dis docs itibaren

>>> 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 

:

dilim + 0()
uygular HT = TOD [:].

(TOS - yığının üst)

CALL_FUNCTION (argc)
bir işlevi çağırır. Düşük bayt argümanı, konumunu konumsal parametrelerin sayısını, anahtar kelime parametrelerinin yüksek bayt sayısını gösterir. Yığında, opcode ilk önce anahtar kelimesini bulur. Her bir anahtar kelime bağımsız değişkeni için değer, anahtarının üstündedir. Anahtar kelime parametrelerinin altında, konum parametreleri, üstte en sağdaki parametreyle yığınta olur. parametrelerinin altında, aranacak işlev nesnesi yığındadır. işlev argümanlarını ve fonksiyonun kendisini yığının dışına çıkarır ve değerini geri döndürür.

İlgili konular