[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