未知

memoize-2的Python项目详细描述


简介[构建状态](https://travis ci.org/rlgomes/memoize.png)(https://travis ci.org/rlgomes/memoize)

函数调用避免重复计算先前处理的输入的结果。


memoize库可用于将memoization功能快速添加到任何
现有函数中,以便您可以缓存先前为
相同参数计算的结果,但不要必须"整理"函数代码,才能将
记忆功能添加到函数中。


在一些python的
文档中有一个非常简单的装饰器实现,但是实现本身是非常基本的,无法处理解决的几个用例。用这个简单的装饰。下面列出了我不使用python文档中示例"memoized"装饰器的原因:


1。它依赖于引发的异常来决定缓存您修饰的函数的当前
结果。如果某个东西在缓存中,则依赖于要抛出到测试中的异常是一个糟糕的设计imho。


2。memoize decorator不处理列表类型和其他一些类型,而
memoize decorator可以用于任何类型,这些类型可以通过str()函数转换为字符串。

3。memoized decorator也不处理关键字参数

4。memoize decorator允许您自定义参数散列函数
,该函数控制在缓存之前计算的结果
期间如何匹配参数。memoize decorator没有这个特性。


在确定传递给
函数的参数确实与前一段时间使用的参数组合相同时使用的转换。


让我们首先展示一个非常递归的函数的简单示例,您可能会发现一个不太熟悉的

``python
def递归函数_normal(arg):
如果arg<;=0:返回1
如果arg==1:返回1
返回递归函数_normal(arg-1)+递归函数_normal(arg-2)
````

现在这个函数看起来足够无辜,但是如果您仔细观察这个函数将实现前一个元素与当前元素的值相当复杂的和。现在,在添加memoize decorator之前,让我们看看这个函数的伸缩性如何:

````
recursive_function_normal(10)花费了0ms
recursive_function_normal(20)花费了13ms
recursive_function_normal(30)花费了688ms
recursive_function_normal(32)花费了1605ms
```


如果我们想计算100或200的
值,可能需要几个小时。现在,将memoization
应用于同一个函数,如下所示:

`` python
@memoize
def recursive_function_memoized(arg):
if arg<;=0:return 1
if arg==1:return 1
return recursive_function_memoized(arg-1)+recursive_function_memoized(arg-2)
`````

这里有一些数字:

```
递归函数记录(10)用了0ms
递归函数记录(20)用了0ms
递归函数记录(30)用了0ms
递归函数记录(32)用了0ms
````

即使从零开始计算100也很快:

```
递归函数(100)花费了2毫秒
```

链接这是不可能的,但请记住,在您计算了10、20和30的值之后,当您发出100的
调用时,您只有几个"新"值要计算,而所有其他
都直接从记忆缓存中提取出来。

如果普通的memoize decorator在处理函数的多个参数时效率不够,并且当您很好地掌握了如何在简单字符串(即散列)中对传递给函数的参数进行唯一编码时,您可以替换内置的"散列"机制。sm
使用"@memoize_with(hash_args)"声明
,然后使用与您试图记住的函数相同的签名定义hash_args。下面是一个小例子,说明如何编写自己的参数散列函数。

/>```

运行内置测试
E(http://www.apache.org/licenses/license-2.0.html)

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

推荐PyPI第三方库


热门话题
java Log4j:运行服务器日志时发出警告   ssl与Java通信到TLSEncypted CUPS打印服务器   Guice Java提供的方法没有已知的依赖关系?   java Android:EditText的默认文本大小是多少?   更正错误字符串的Java异常   string Java如何从来自多个源的数据推断类型   从路径错误创建java文件   java获取不同类安卓中切换按钮的状态   java扩展AnyVal和AnyRef的对象的内存分配有什么不同   java如何从callable(即runnable)获取类名   java Hornetq大量消息填满了磁盘空间   用java从excel中读取一行的多列?   java不使用JAXB将映射转换为XML   java将多个图像与一个图像进行比较   当X扩展Y时,javax不适用于参数Y   运行时jar文件中未显示java Python输出   JavaSpringMVC3:定义自己的DatatypeBinding   java从fragment类调用activity函数给出了NPE   java在时区、日历和SimpleDataFormat方面存在奇怪的问题