Pregunta

Estaba tratando de encontrar la forma más rápida de contar el número de elementos en una lista que coincide con un filtro específico. En este caso, encontrar cuántos números impares hay en una lista.

Mientras hacía esto, me sorprendió los resultados de comparar una comprensión de la lista frente a la expresión de generador 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

También he intentado con L una lista regular y diferentes tamaños, pero en todos los casos la comprensión de la lista gana.

¿Qué está haciendo Genexp que hace que sea más lento en comparación con el ListComp que crea una nueva lista con 1 millón de elementos ...?

(Por cierto, la forma más rápida que encontré fue: x = 1; len(filter(x.__and__, L)). Y sí, sé que escribir código como ese mata a los gatitos, lo estoy haciendo por diversión)

¿Fue útil?

Solución

Cuando hay una memoria esencialmente ilimitada disponible (que siempre será el caso en pequeños puntos de referencia, ¡aunque a menudo no en problemas del mundo real!-), las listas tenderán a superar a los generadores porque pueden asignarse solo una vez, en un "gran grupo" ( No hay fragmentación de memoria, etc.), mientras que los generadores requieren (internamente) un esfuerzo adicional para evitar ese enfoque de "gran grupo" al preservar el estado de marco de pila para permitir la reanudación de la ejecución.

Si un enfoque de lista o un enfoque generador será más rápido En un programa real Depende de la situación de memoria exacta, incluida la fragmentación, que es casi imposible de reproducir con precisión en un "micro bencillo". Iow, al final, si realmente le importa el rendimiento, debe comparar cuidadosamente (y, por separado, perfil) sus programas reales, no solo micro-benchmarks "juguete", en el caso general.

Otros consejos

Intenta esto:

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

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

      }  
    }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top