2012/1/18 Giuseppe Amato <giuam...@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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a