Estaba tratando de encontrar la forma más rápida de contar la cantidad de elementos en una lista que coincida con un filtro específico. En este caso, encontrar cuántos números impares hay en una lista.¿Por qué este genexp funciona peor que una lista de comprensión?
Mientras hace esto, yo estaba sorprendido por los resultados de la comparación de una lista por comprensión frente a la expresión equivalente del generador:
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 siendo L una lista regular, y diferentes tamaños, pero en todos casos gana la lista de comprensión.
¿Qué está haciendo el 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 manera más rápida que encontré fue: x = 1; len(filter(x.__and__, L))
Y el código sí, ya sé escribir como que mata gatitos, estoy haciendo por el gusto de hacerlo.)
1+. También se puede observar que en muchos casos los generadores pueden usar menos memoria debido a su flujo como la naturaleza. Considere leer cada línea de un archivo en una lista y compararla con la lectura de cada línea, trabajar con ella y descartarla. – Skurmedel