Ответ 1
Если вы хотите уменьшить объем памяти, вы можете избежать генерации временного списка с помощью генератора:
sum(x > 0 for x in frequencies)
Это работает, потому что bool
является подклассом int
:
>>> isinstance(True,int)
True
и True
значение равно 1:
>>> True==1
True
Однако, как отмечает Джо Голтон в комментариях, это решение происходит не очень быстро. Если у вас достаточно памяти для использования промежуточного временного списка, то sth solution может быть быстрее. Ниже приведены некоторые моменты, сравнивающие различные решения:
>>> 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
Остерегайтесь того, что результаты timeit могут различаться в зависимости от версии Python, ОС или аппаратного обеспечения.
Конечно, если вы делаете математику в большом списке чисел, вероятно, вы должны использовать NumPy:
>>> frequencies = np.random.randint(3, size=10**5)
>>> %timeit (frequencies > 0).sum()
1000 loops, best of 3: 669 us per loop
Для массива NumPy требуется меньше памяти, чем эквивалентный список Python, и вычисление может выполняться намного быстрее, чем любое чистое решение Python.