Domanda

Stavo cercando di trovare il modo più rapido per contare il numero di elementi in un elenco che corrispondeva a un filtro specifico. In questo caso, trovare quanti numeri dispari ci sono in un elenco.

Mentre lo facevo, sono stato sorpreso dai risultati del confronto di una comprensione dell'elenco contro l'espressione del generatore equivalente:

python -m timeit -s "L = xrange(1000000)" "sum([1 for i in L if i & 1])"
10 loops, best of 3: 109 msec per loop

python -m timeit -s "L = xrange(1000000)" "sum(1 for i in L if i & 1)"
10 loops, best of 3: 125 msec per loop

Ho anche provato con L essendo un elenco regolare e diverse dimensioni, ma in tutti i casi vince la comprensione dell'elenco.

Cosa sta facendo il Genexp che lo fa essere più lento rispetto all'elencoComp che crea un nuovo elenco con 1 milione di articoli ...?

(A proposito, il modo più veloce che ho trovato è: x = 1; len(filter(x.__and__, L)). E sì, so che scrivere un codice del genere uccide i gattini, lo sto facendo per il divertimento)

È stato utile?

Soluzione

Quando è disponibile una memoria essenzialmente illimitata (che sarà invariabilmente il caso dei minuscoli benchmark, sebbene spesso non in problemi del mondo reale!-), gli elenchi tenderanno a sovraperformare i generatori perché possono essere assegnati solo una volta, in un "grande mazzo" ( Nessuna frammentazione di memoria, ecc.), Mentre i generatori richiedono uno sforzo (internamente) extra per evitare quell'approccio "grande mazzo" preservando lo stato del telaio dello stack per consentire la ripresa dell'esecuzione.

Se un approccio elenco o un approccio generatore sarà più veloce In un vero programma Dipende dall'esatta situazione di memoria, inclusa la frammentazione, che è impossibile da riprodurre accuratamente in un "micro-benchmark". IOW, alla fine, se ti interessa veramente le prestazioni, devi benchmark (e, separatamente, profilo) i tuoi programmi reali, non solo i micro-benchmark "giocattolo", nel caso generale.

Altri suggerimenti

Prova questo:

function draw(id, clr, fill) {  
      var canvas = document.getElementById(id);  
      if (canvas.getContext) {  
        var ctx = canvas.getContext("2d");  

        ctx.fillStyle = clr;  
        ctx.fillRect (fill);  

      }  
    }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top