1 functools函数
functools模块用于高阶函数:作用与或者返回其它函数的函数。一般来说,对于该模块,任何可调用对象都可以视为一个函数。
functools模块定义了以下函数:
1.1 functools.cmp_to_key(func)
版本3.2中新增。
将旧风格的比较函数转换为key函数。用于接收key函数的工具(例如sorted()
,min()
,max()
,heapq.nlargest()
,heapq.nsmallest()
,itertools.groupby()
)。该函数主要用作支持比较函数的Python 2转换工具。
比较函数可以是任何可调用的对象,接收两个参数,比较它们,如果小于返回负数,相等返回0,大于返回正数。key函数是一个可调用对象,接收一个参数,并返回另一个值用于排序的键。
示例:
sorted(iterable, key=cmp_to_key(locale.strcoll)) # locale-aware sort order
1.2 @functools.lru_cache(maxsize=128, typed=False)
版本3.2中新增。
版本3.3中修改:增加可选参数typed参数。
装饰器用一个有记忆的调用包装一个函数,它可以保存最近maxsize次调用。当使用同样的参数定期调用费时或I/O绑定的函数时,它可以节省时间。
因为使用字典缓存结果,所以函数的位置和关键字参数必须是hashable。
如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限增长。当maxsize设置为 2n 时,性能最佳。
如果typed设置为真,则不同类型的函数参数会分别缓存。例如,f(3)
和f(3.0)
将视为不同结果的不同调用。
为了帮助测量缓存的有效性并调整maxsize参数,包装函数使用cache_info()
函数返回一个命名元组,包括hits,misses,maxsize和currsize。在多线程环境中,hits和misses是近似值。
装饰器还提供了cache_clear()
函数用于清除缓存,或者让缓存失效。
原始的底层函数通过wrapped属性访问。这对于内省,绕过缓存,或者重新装饰函数很有用。
当最近调用是即将调用的最佳调用因子时(例如,新闻服务器上的最受欢迎文章常常每天改变),LRU(least recently used)缓存效果最好。缓存的大小限制确保缓存不会在长时间运行的进程(如web服务器)上不受限制的增长。
用于静态Web内容的LRU缓存示例:
@lru_cache(maxsize=32)
def get_pep(num):
'Retrieve text of a Python Enhancement Proposal'
resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
try:
with urllib.request.urlopen(resource) as s:
return s.read()
except urllib.error.HTTPError:
return 'Not Found'
>>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320,