Si desea reducir la cantidad de memoria, se puede evitar la generación de una lista temporal mediante el uso de un generador:
sum(x > 0 for x in frequencies)
Esto funciona porque bool
es una subclase de int
:
>>> isinstance(True,int)
True
y el valor True
es 1:
>>> True==1
True
Sin embargo, como señala Joe Golton en los comentarios, esta solución no es muy rápida. Si tiene suficiente memoria para usar una lista temporal intermedia, entonces sth's solution puede ser más rápido. Aquí están algunos tiempos comparando diversas soluciones:
>>> frequencies = [random.randint(0,2) for i in range(10**5)]
>>> %timeit len([x for x in frequencies if x > 0]) # sth
100 loops, best of 3: 3.93 ms per loop
>>> %timeit sum([1 for x in frequencies if x > 0])
100 loops, best of 3: 4.45 ms per loop
>>> %timeit sum(1 for x in frequencies if x > 0)
100 loops, best of 3: 6.17 ms per loop
>>> %timeit sum(x > 0 for x in frequencies)
100 loops, best of 3: 8.57 ms per loop
Tenga en cuenta que los resultados TimeIt pueden variar dependiendo de la versión de Python, el sistema operativo o hardware.
Por supuesto, si usted está haciendo matemáticas en una larga lista de números, probablemente debería estar utilizando NumPy:
>>> frequencies = np.random.randint(3, size=10**5)
>>> %timeit (frequencies > 0).sum()
1000 loops, best of 3: 669 us per loop
La matriz NumPy requiere menos memoria que la lista de Python equivalente, y el cálculo puede ser se realizó mucho más rápido que cualquier solución pura de Python.
contando elementos distintos de cero no es el mismo que elementos de recuento> 0. El título debe modificarse en consecuencia – joaquin
Actualicé el título de su pregunta para que refleje su contenido. Espero que esto esté bien contigo. – EOL