list
その関数の入力をに格納し、格納された後にのみ関数を呼び出すデコレータを作成するにはどうすればよいn
ですか?
質問する
86 次
3 に答える
0
100,000回の呼び出しfunc
ごとに呼び出し、@counter
機能する前にで使用します。
def counter(func):
def wrapper(val, *args, **kwargs):
if val:
wrapper.count = wrapper.count + 1
if wrapper.count % 100000 == 0: # insert 100,000 at a time, should be speedier thanks to `.executemany()`
to_logfile(str(wrapper.count) + '\n', 'counter2.log')
return func(wrapper.valarr, *args, **kwargs)
else:
if len(wrapper.valarr)==1000000:
wrapper.vallarr = []
wrapper.valarr.append([val])
return
wrapper.count = 0
wrapper.valarr = []
return wrapper
(改善を提案してください)
于 2012-06-10T18:47:28.730 に答える
0
他の人が関数の実装を提出したので、これがクラスの実装です:
class IntervalCache(object):
def __init__(self, f):
self._f = f
self._cache = []
self._n = 0
self._interval = 1000
def __call__(self, *args, **kwargs):
if self._n == self._interval:
result = [self.f(*c_args, **c_kwargs) for c_args, c_kwargs in self._cache]
self._n = 0
self._cache = []
return result + [self.f(*args, **kwargs)]
else:
self._cache.append((*args, **kwargs))
self._n += 1
@property
def getCache(self):
return self._cache
def resetCache(self):
self._cache = []
self._n = 0
def getInterval(self):
return self._interval
def setInterval(self, value):
self._interval = value
interval = property(getInterval, setInterval)
使用法:
#wrapping a function
@IntervalCache
def foo(*args, **kwargs):
print args, kwargs
return True
#setting the caching interval
foo.interval = 10
#calling foo a bunch of times
for i in range(20):
print foo(i, i+1, bar=i*2)
#retrieving the contents of the cache
print foo.getCache()
#resetting the contents of the cache
foo.resetCache()
于 2012-06-10T19:34:29.367 に答える
0
私はそれを推測するつもりです
- 関数は任意の数の位置引数を受け入れます
f(a); f(b)
と同じですf(a, b)
- 何も返しません(副作用として結果が発生します)
。
import functools
class Batcher(object):
def __init__(self, n=100):
self.n = n
def __call__(self, fn):
@functools.wraps(fn)
def _fn(*args):
_fn.cache.extend(args)
_fn.calls += 1
if _fn.calls == _fn.n:
fn(*_fn.cache)
_fn.cache = []
_fn.calls = 0
_fn.n = self.n
_fn.cache = []
_fn.calls = 0
return _fn
それからそれをテストし、
@Batcher(20)
def mysum(*args):
print sum(args)
for i in range(1,25):
mysum(i)
プリント
210 # <- result of sum(1..20)
于 2012-06-10T19:50:02.137 に答える