def clock(func): @functools.wraps(func) def clocked(*args, **kwargs): t0 = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - t0 name = func.__name__ arg_lst = [] if args: arg_lst = ‘, ‘.join(repr(arg) for arg in args) if kwargs: pairs = [‘%s=%r‘ % (k, w) for k, w in sorted(kwargs.items())] arg_lst.append(‘, ‘.join(pairs)) arg_str = ‘, ‘.join(arg_lst) print(‘[%0.8fs] %s(%s) -> %r‘ % (elapsed, name, arg_str, result)) return result return clocked
@clock def fibonacci(n): if n < 2: return n return fibonacci(n-2) + fibonacci(n-1) if __name__ == ‘__main__‘: print(fibonacci(6))
$ python3 fibo_demo.py [0.00000095s] fibonacci(0) -> 0 [0.00000095s] fibonacci(1) -> 1 [0.00007892s] fibonacci(2) -> 1 [0.00000095s] fibonacci(1) -> 1 [0.00000095s] fibonacci(0) -> 0 [0.00000095s] fibonacci(1) -> 1 [0.00003815s] fibonacci(2) -> 1 [0.00007391s] fibonacci(3) -> 2 [0.00018883s] fibonacci(4) -> 3 [0.00000000s] fibonacci(1) -> 1 [0.00000095s] fibonacci(0) -> 0 [0.00000119s] fibonacci(1) -> 1 [0.00004911s] fibonacci(2) -> 1 [0.00009704s] fibonacci(3) -> 2 [0.00000000s] fibonacci(0) -> 0 [0.00000000s] fibonacci(1) -> 1 [0.00002694s] fibonacci(2) -> 1 [0.00000095s] fibonacci(1) -> 1 [0.00000095s] fibonacci(0) -> 0 [0.00000095s] fibonacci(1) -> 1 [0.00005102s] fibonacci(2) -> 1 [0.00008917s] fibonacci(3) -> 2 [0.00015593s] fibonacci(4) -> 3 [0.00029993s] fibonacci(5) -> 5 [0.00052810s] fibonacci(6) -> 8 8
@functools.lru_cache() @clock def fibonacci(n): if n < 2: return n return fibonacci(n-2) + fibonacci(n-1) if __name__ == ‘__main__‘: print(fibonacci(6))
$ python3 fibo_demo_lru.py [0.00000119s] fibonacci(0) -> 0 [0.00000119s] fibonacci(1) -> 1 [0.00010800s] fibonacci(2) -> 1 [0.00000787s] fibonacci(3) -> 2 [0.00016093s] fibonacci(4) -> 3 [0.00001216s] fibonacci(5) -> 5 [0.00025296s] fibonacci(6) -> 8
functools.lru_cache(maxsize=128, typed=False)
import html
def htmlize(obj): content = html.escape(repr(obj)) return ‘<pre>{}</pre>‘.format(content)
>>> htmlize({1, 2, 3}) ? ‘<pre>{1, 2, 3}</pre>‘ >>> htmlize(abs) ‘<pre><built-in function abs></pre>‘ >>> htmlize(‘Heimlich & Co.\n- a game‘) ? ‘<p>Heimlich & Co.<br>\n- a game</p>‘ >>> htmlize(42) ? ‘<pre>42 (0x2a)</pre>‘ >>> print(htmlize([‘alpha‘, 66, {3, 2, 1}])) ? <ul> <li><p>alpha</p></li> <li><pre>66 (0x42)</pre></li> <li><pre>{1, 2, 3}</pre></li> </ul>
from functools import singledispatch from collections import abc import numbers import html @singledispatch ? def htmlize(obj): content = html.escape(repr(obj)) return ‘<pre>{}</pre>‘.format(content)
@htmlize.register(str) ? def _(text): ? content = html.escape(text).replace(‘\n‘, ‘<br>\n‘) return ‘<p>{0}</p>‘.format(content)
@htmlize.register(numbers.Integral) ? def _(n): return ‘<pre>{0} (0x{0:x})</pre>‘.format(n) @htmlize.register(tuple) ?
@htmlize.register(abc.MutableSequence) def _(seq): inner = ‘</li>\n<li>‘.join(htmlize(item) for item in seq)
return ‘<ul>\n<li>‘ + inner + ‘</li>\n</ul>‘
标准库中最值得关注的两个 装饰器是 lru_cache 和全新的 singledispatch(Python 3.4 新增)
原文:https://www.cnblogs.com/xiangxiaolin/p/11671344.html