2016-05-17 72 views
0

我有一個計算功能。爲每個數據點計算它需要很長的時間,但是爲整個數據集計算它有內存和網絡問題。我我的計算(說每200個數據點計算)使事情變得可口。用於在Python中批量計算大數據的裝飾器函數

有沒有一種方法來修飾給定批量大小的任意函數?

喜歡的東西:

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

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

我目前使用的是正常的功能,其工作原理,但我覺得用裝飾可能更模塊化。

def batchify(f, d, batch_size=200): 
    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] 

回答

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 
    ... 
+0

圍繞裝飾器的另一個包裝。這很有道理,謝謝。 – tokestermw