memoize/cache函数调用结果

memop的Python项目详细描述


https://travis-ci.org/tscizzle/memopy.svg?branch=masterhttps://coveralls.io/repos/github/tscizzle/memopy/badge.svg?branch=masterhttps://badge.fury.io/py/memopy.svg

存储函数调用的结果,以便具有相同参数的后续调用不必重做工作。

这种记忆过去结果的策略只有在“纯功能”下才是完全正确的。纯函数(https://en.wikipedia.org/wiki/Pure_function)是在使用相同参数运行时始终返回相同结果的函数。它们不应该有任何副作用(例如修改全局变量、写入外部数据库),也不应该依赖于参数之外的任何东西(例如随机数生成器、从外部数据库读取)。通常,任何数学定义的函数(斐波那契、阶乘、正弦、余弦等)都是纯函数。

但是memopy在不需要完全正确性的情况下也可以用于不纯洁的函数。例如,它可用于将网络调用的结果缓存到外部api,以避免重复昂贵的网络请求(但当需要获得最新的完整信息时,应清除缓存)。

使用

导入memoify decorator:

from memopy.memopy import memoify

memoifydecorator应用于函数,以将该函数转换为备注函数:

@memoify
def multiply(x, y):
    return x * y

使用相同参数对multiply的后续调用不会执行乘法,而是查找过去的答案。

乘法并不是一个典型的用例,所以看看一个函数,它在很多情况下都是在同一个参数上重用的:

@memoify
def fibo(n):
    if n in [0, 1]:
        return n
    return fibo(n-1) + fibo(n-2)

如果没有记忆,斐波那契数列的某些值将被计算成指数次数。使用单行@memoify,对于给定的n,第一次计算之后的每个计算都将替换为查找。查看上述记录版本的FIBO与相同功能的常规版本之间的差异:

def regular_fibo(n):
    if n in [0, 1]:
        return n
    return regular_fibo(n-1) + regular_fibo(n-2)

看看随着n的增大,差异是如何增大的。(例如,对我来说,使用n = 30,差别已经非常明显,而使用n = 100regular_fibo需要永远,而使用的fibo仍然是即时的。)

散列性

函数参数不需要就可以散列,但它们应该是最佳(最快)结果。如果不是,则在特殊情况下(取决于原始函数的运行时,以及调用该记忆版本的不同参数的数量和性质),函数的记忆版本可能会比原始版本慢。

并发性

memopy的设计并没有考虑到并发性。因此,建议不要同时在不同线程中多次运行同一个函数,因为还没有彻底考虑会发生什么。

文件

在github的https://github.com/tscizzle/memopy/tree/master/tests上找到的测试提供了一些示例并展示了库的功能。

安装

如果您没有pip,请拨打:https://pip.pypa.io/en/stable/installing

在终端中运行命令pip install memopy以获取memopy库。

要测试安装,请在终端中使用python命令启动一个python解释器,并确保可以在其中运行import memopy,而不会出现错误。

贡献

在github上找到代码:https://github.com/tscizzle/memopy

支架

联系我(泰勒·辛格·克拉克)在tscizzle@gmail.com有任何问题或关切。

许可证

这个项目是根据麻省理工学院的许可证授权的

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript如何找到socket。同一局域网上的IO服务器?   将Java代码格式化为Word/RTF格式   java学习对象以及如何将分配的变量封装到私有变量   java Websocket客户端不在Tomcat中工作   java如何在点击按钮时打开本机表情键盘?   java使用哪个Maven GlassFish插件?   Eclipse Java构建路径不允许添加外部JAR   继承Java6集合。勾选适当的用法   JavaApacheDateUtils:使用多个模式解析日期   java hibernate如何生成查询?   具有id或链接的java Dropbox下载文件或文件夹   java模态对话框未在PrimeFaces 5上显示   java将类对象转换为人类可读的字符串   更新数据库中字段的java通用方法   java无法通过Apache Tomcat访问网络文件夹