memoize/cache函数调用结果
memop的Python项目详细描述
存储函数调用的结果,以便具有相同参数的后续调用不必重做工作。
这种记忆过去结果的策略只有在“纯功能”下才是完全正确的。纯函数(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 = 100,regular_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有任何问题或关切。
许可证
这个项目是根据麻省理工学院的许可证授权的