functools模块

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()函数返回一个命名元组,包括hitsmissesmaxsizecurrsize。在多线程环境中,hitsmisses是近似值。

装饰器还提供了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, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值