[Python] Assegnamento e liste

Daniele Varrazzo piro a develer.com
Mer 18 Gen 2012 23:46:46 CET


> 2012/1/18 Giuseppe Amato <giuamato a gmail.com>:
>
>>> Sempre tenendo in considerazione il costo computazione di rimuovere
>>> elementi in mezzo o in testa ad una lista python ordinaria.
>>>
>>
>> Quindi c'è differenza in termini di costo computazione tra:
>>
>> lista=lista[:-1]
>> e
>> lista.pop()
>>
>> ?
>> Non mi ero mai posto il problema, ma immaginavo che le due 
>> istruzioni
>> fossero equivalenti.
>> A meno che il pop oltre la riassegnazione della lista effettui anche
>> l'eliminazione e lo spostamento degli altri elementi.
>> Mi sai dare qualche risorsa?

Più che altro queste due istruzioni sono completamente diverse dal 
punto di vista semantico: la prima crea una nuova copia della lista, 
tranne l'ultimo elemento. La seconda la cambia sul posto. Se in 
precedenza hai un secondo assegnamento:

lista2 = lista

e poi esegui queste operazioni su "lista", cossa conterrà lista2?


On Wed, 18 Jan 2012 19:56:12 +0100, enrico franchi wrote:

> Una chiamata di funzione e' un pochetto piu' lenta (visto che deve
> istituire uno stack frame, ritornare, etc etc etc) di chiamare
> direttamente un opcode. Ha senso. Suppongo (ma non sono un'esperto
> degli internals che invece LOAD_ATTR e LOAD_CONST siano "grosso modo"
> equivalenti -- ma sempre scommettendo, direi che LOAD_CONST e' piu'
> veloce).

È così. LOAD_CONST è più veloce perché prende un elemento da un array 
collegato al blocco di codice (l'argomento è la posizione dell'elemento 
nell'array delle costanti).

     In [1]: def f():
        ...:     return [10,20,30]
        ...:

     In [2]: f.func_code.co_consts
     Out[2]: (None, 10, 20, 30)

     In [3]: from dis import dis

     In [4]: dis(f)
       2           0 LOAD_CONST               1 (10)
                   3 LOAD_CONST               2 (20)
                   6 LOAD_CONST               3 (30)
                   9 BUILD_LIST               3
                  12 RETURN_VALUE

LOAD_ATTR equivale funzionalmente a getattr(), quindi potrebbe 
richiedere di passare attraverso tutta la burocrazia di __getattr__ e 
__getattribute__, effettuare il lookup al dizionario, se è un'istanza 
chiedere alla classe e alle sue sopraclassi... potrebbe doversi fare un 
discreto mazzo :) compreso invocare ulteriore codice Python.


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python