gpt4 book ai didi

python - 一次性计算发电机的统计数据。 Python

转载 作者:行者123 更新时间:2023-11-28 20:50:57 25 4
gpt4 key购买 nike

使用生成器时,您只能一次拉出元素。另一种方法是将生成器加载到列表中并进行多次传递,但这会影响性能和内存分配。

有谁能想出一种更好的方法来一次通过生成器计算以下指标。理想情况下,代码会计算计数、总和、平均值、标准差、最大值、最小值以及您能想到的任何其他统计数据。

更新

这个要点中的初始可怕代码。请在此处查看要点: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)

最佳答案

def statistics(it):
"""Returns number of elements, sum, max, min"""

it = iter(it)

x0 = next(it)
maximum = minimum = total = x0
n = 1

for x in it:
maximum = max(maximum, x)
minimum = min(minimum, x)
total += x
n += 1

return n, total, maximum, minimum

根据需要添加其他统计信息。当要计算的统计量变大时,考虑使用 namedtuple

如果你真的想变得很花哨,你可以构建一个面向对象的统计收集器层次结构(未经测试):

class Summer(object):
def __init__(self, x0=0):
self.value = x0

def add(self, x):
self.value += x

class SquareSummer(Summer):
def add(self, x):
super(SquareSummer, self).add(x ** 2)

class Maxer(object):
def __init__(self, x0):
self.value = x0

def add(self, x):
self.value = max(self.value, x)

# example usage: collect([Maxer, Summer], iterable)
def collect(collectors, it):
it = iter(it)

x0 = next(it)
collectors = [c(x0) for c in collectors]

for x in it:
for c in collectors:
c.add(x)

return [c.value for c in collectors]

关于python - 一次性计算发电机的统计数据。 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11308146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com