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第三方库


热门话题
java如何通过循环Id数组设置按钮Id,并使用循环设置按钮文本?   java在一个JTextField中添加字符串和int值   java如何解析2006年2月20日这样的日期?   java Android我试图从SharePreference获取数据   java如何在springboot中将ObjectId转换成字符串   java如何在ListActivity中将按钮返回工具栏   web服务如何使用免费API或web服务从java程序向手机发送短信   java Udp如何从服务器获取整数?   使用DAM资产进行java AEM JUnit测试   数组Java程序循环不会执行并提示用户?   安卓上的java改造2和xml   java 安卓中有字典数据类型吗?   java如何单元测试guice createinjector方法   java无法为Pulsar设置Zookeeper群集   java我无法解密发送消息AES   Java中的tomcat异步   java如何修复“OAutheException,errorMessage:(#803)您请求的某些别名不存在:您的(应用程序)ID}”   java通过构造函数传递整数