python的cache修饰器
简单的memory cache。可以用来内存缓存任意函数方法。
#!/usr/bin/python import functools
from threading import RLock
import logging LOGGER = logging.getLogger(__name__) class CacheNullValue(object):
pass _Null = CacheNullValue() class Cache(object): def __init__(self, cache_limit=1000):
self._cache = {}
self._queue = []
self.cache_limit = cache_limit
self._lock = RLock() def __getitem__(self, name):
with self._lock:
return self._cache.get(name, _Null)
get = __getitem__ def __setitem__(self, name, value):
with self._lock:
if len(self._queue) >= self.cache_limit:
del self._cache[self._queue.pop(0)]
self._queue.append(name)
self._cache[name] = value
set = __setitem__ def cache(cache_limit):
"""A function decorator for method cache store
""" def cached(f):
@functools.wraps(f)
def _cached(*args, **kwargs):
cid = repr((args, kwargs))
data = _cached.cache.get(cid)
if data != _Null:
LOGGER.debug('hit cached `' + _cached.__name__ + '` for ' + cid)
return data
data = _cached.f(*args, **kwargs)
_cached.cache.set(cid, data)
return data _cached.f = f
_cached.cache = Cache(cache_limit) return _cached return cached def setup(cache_limit):
""" A global thread safe key-value store
"""
global _cache_object
_cache_object = Cache(cache_limit) def set(cid, data): _cache_object.set(cid, data) def get(cid):
return _cache_object.get(cid) if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', filemode='a+') class T(object): @cache(100)
def c(self, t):
return t @cache(100)
def cc(t):
return t t = T()
print t.c('hello')
print t.c('hello')
print t.c('h')
print t.c('hello')
print cc('he')
print cc('he')
python的cache修饰器的更多相关文章
- python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
- python 进阶:修饰器的介绍
参考链接:Python 函数装饰器 我认为python中的装饰器是一个很厉害的功能,他能瞬间提升代码的逼格,但对于我这样的小白来说,别说为所欲为的使用了,就连简单的尝试一下,却也是难于登天.经过长达半 ...
- Python 详解修饰器 附带 js使用修饰器
修饰器 功能 修饰器的主要功能是,在不改变已有代码的情况下,为某一个类,方法等扩展功能 首先看这样一段代码 def foo(): for i in range(10): print(i) foo() ...
- Python修饰器的函数式编程
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- Python修饰器
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- Python修饰器的函数式编程(转)
From:http://coolshell.cn/articles/11265.html 作者:陈皓 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desi ...
- python 修饰器 最好的讲解
Python的修饰器的英文名叫Decorator,修饰器就是对一个已有的模块做一些“修饰工作”,比如在现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能 ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- python修饰器(装饰器)以及wraps
Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...
随机推荐
- PHP fgets 函数
<?php $handle=fopen("../good/html/1.txt","r"); ; //打开一个远程文件 $content="&q ...
- AJPFX总结java InputStream读取数据问题
1. 关于InputStream.read() 在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低. ...
- AJPFX总结面向对象(this和super的区别和应用)
面向对象(this和super的区别和应用)(掌握)* A:this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当 ...
- Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...
- 【HEVC帧间预测论文】P1.5 Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule
Fast Coding Unit Size Selection for HEVC based on Bayesian Decision Rule <HEVC标准介绍.HEVC帧间预测论文笔记&g ...
- 语音行业技术领先者Nuance诚招ASR/NLP研发工程师和软件工程师
Nuance is a leading provider of voice and language solutions for businesses and consumers around the ...
- subprocess使用小方法
import subprocess def create_process(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subp ...
- EOS Dawn 3.0 智能合约 -- 新格式
1.简介 随着EOS Dawn 3.0发布,智能合约的坑又要重新踩了o(╥﹏╥)o:3.0不仅将原来本身就在链里的基础合约独立出来,简单的介绍见3.0合约改变,合约的书写方式也有巨大变化,相比之前更加 ...
- iview分析
- rfcn讲解博客
http://www.cnblogs.com/lillylin/p/6277094.html ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的 ...