При работе с генераторами вы можете вытаскивать предметы только за один проход. Альтернативой является загрузка генератора в список и выполнение нескольких проходов, но это связано с ударом по производительности и распределению памяти.Вычисление статистики по генераторам за один проход. Python
Может ли кто-нибудь подумать о лучшем способе вычисления следующих показателей из генератора за один проход. В идеале код вычисляет счет, сумму, средний, sd, max, min и любую другую статистику, о которой вы можете думать.
UPDATE
Первоначальный противный код в этом суть. См. Раздел: https://gist.github.com/3038746
Использование замечательных предложений от @larsmans здесь является окончательным решением, с которым я пошел. Использование названного кортежа действительно помогло.
import random
from math import sqrt
from collections import namedtuple
def stat(gen):
"""Returns the namedtuple Stat as below."""
Stat = namedtuple('Stat', 'total, sum, avg, sd, max, min')
it = iter(gen)
x0 = next(it)
mx = mn = s = x0
s2 = x0*x0
n = 1
for x in it:
mx = max(mx, x)
mn = min(mn, x)
s += x
s2 += x*x
n += 1
return Stat(n, s, s/n, sqrt(s2/n - s*s/n/n), mx, mn)
def random_int_list(size=100, start=0, end=1000):
return (random.randrange(start,end,1) for x in xrange(size))
if __name__ == '__main__':
r = stat(random_int_list())
print r #Stat(total=100, sum=56295, avg=562, sd=294.82537204250247, max=994, min=10)
'stat.n + = 1.0' Тысячи мертвых математиков качению в могилах .. . –
Используйте numpy. Он обладает всеми встроенными функциями, которые вам нужны, и он быстрее, чем петли python. – eumiro
Lol @ IgnacioVazquez-Abrams любым другим способом вы могли бы сделать это с помощью генератора? –