我有一个做一些计算的函数。为每个数据点计算它需要太长时间,但为整个数据集计算它会产生内存和网络问题。我批量我的计算(比如计算每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)
答案 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
...