一个装饰器函数,用于在Python中对大数据进行批处理计算

时间:2016-05-17 00:59:03

标签: python

我有一个做一些计算的函数。为每个数据点计算它需要太长时间,但为整个数据集计算它会产生内存和网络问题。我批量我的计算(比如计算每200个数据点)以使事情变得可口。

有没有办法在给定批量大小的情况下装饰任意函数?

类似的东西:

if (typeof response !== "undefined" && response.gotIt == "Got it") {
    console.log("Got it!");
}

我目前使用的是普通函数,但我认为使用装饰器可能更模块化。

@batchify(batch_size=200)
def long_computations(x):
    ...
    return x

data = [0]*100000
batched_results = long_computations(data)

1 个答案:

答案 0 :(得分:1)

只需添加几层额外的嵌套函数,就可以很容易地将当前函数转换为装饰工厂:

import functools

def batchify(batch_size=200):
    def decorator(f):
        @functools.wraps(f)
        def wrapper(d):
            assert isinstance(d, list), "data has to be in list form."
            N = len(d)
            results = []
            for i in xrange(N / batch_size + 1):
                low = i * batch_size
                high = min((i + 1) * batch_size, N)
                result = f(d[low:high])
                results.append(result)
            return [r for result in results for r in result]
        return wrapper
    return decorator

我还建议您可以稍微简化批处理逻辑。在列表末尾切片并不会导致任何问题。 Python将处理一个超越结束的切片,就好像它正好结束,这正是我们想要的。我使用:

for i in xrange(0, N, batch_size):
    result = f(d[i, i + batch_size]) # This slice still works if i+batch_size > N
    ...