单次迭代共享迭代器

Rug*_*rra 3 python iterator

我有很多数据,通常是在一个文件中.我想计算一些数量,所以我有这样的功能:

def mean(iterator):
    n = 0
    sum = 0.
    for i in iterator:
      sum += i
      n += 1
    return sum / float(n)
Run Code Online (Sandbox Code Playgroud)

我也有很多其他类似的功能(var,size,...)

现在我有一个迭代器迭代数据:iter_data.我可以计算我想要的所有数量:m = mean(iter_data); v = var(iter_data)等等,但问题是我多次迭代,这在我的情况下是昂贵的.实际上I/O是最昂贵的部分.

所以,问题是:我可以计算我的批量m, v, ...迭代只是一个时间iter_data 保持独立的功能mean,var...所以,它很容易增加新的?

我需要的是类似于boost :: accumulators的东西

das*_*obu 5

例如,使用对象和回调,如:

class Counter():
    def __init__(self):
        self.n = 0
    def __call__(self, i):
        self.n += 1

class Summer():
    def __init__(self):
        self.sum = 0
    def __call__(self, i):
        self.sum += i


def process(iterator, callbacks):
    for i in iterator:
        for f in callbacks: f(i)

counter = Counter()
summer = Summer()
callbacks = [counter, summer]
iterator = xrange(10) # testdata
process(iterator, callbacks)

# process results from callbacks
n = counter.n
sum = summer.sum
Run Code Online (Sandbox Code Playgroud)

这很容易扩展,只迭代数据一次.