装饰器将函数计算永久性地存储到磁盘上。

funes的Python项目详细描述


富内斯

Funes允许你用这样一种方式来装饰函数,使它们的计算永久性地存储在磁盘上。在

它是以博尔赫斯的短篇小说Funes the Memories命名的。在

背景

通过使用@memorious修饰符装饰这些函数,这个包允许将昂贵函数的结果缓存到磁盘上。当对相同的输入再次调用该函数时,缓存的结果将从磁盘加载并返回。在

这是通过对结果和输入进行酸洗并将其写入磁盘来实现的,方法是使用一个唯一的路径来标识正在缓存的函数的特定版本(基于依赖于其定义的哈希,这要归功于“dill”包),以及一个依赖于函数哈希参数的键。在

内存函数不应包含(可能相互)递归定义,否则堆栈将溢出。如果依赖的函数发生更改,它们的哈希值将更改,但只有当依赖项保留在当前模块中时,才会遵循这些依赖项。在

pickled结果将缓存在cache/funcname/hexhash/arg下_哈希.dill. 这些文件可以手动删除以清除缓存,也可以在计算机之间传输。在

每个pickled计算都包含一个字典,其中包含以下键: input:函数参数的有序dict+它们提供的(或默认的)值
output:不管函数产生了什么 time:函数运行所用的时间(秒)

可以向任何内存函数提供一个特殊的global_seed关键字参数,以便在运行函数之前设置全局随机种子。这允许使用受控的随机性,同时保持缓存的好处。在

示例

下面的脚本演示了funes背后的基本思想:

from funes import memorious, load_cached_results
from time import sleep

@memorious
def double(x):
    print('doubling', x)
    sleep(0.5)
    return x * 2

print("uncached (will be slow)")
for i in range(5):
    double(i)

print("cached (will be fast)")
for i in range(5):
    double(i)

print("uncached (will be slow, unique global seed)")
for seed in range(5):
    double(0, global_seed=seed)

print("cached (will be fast, reuse global seed)")
for seed in range(5):
    double(0, global_seed=seed)

print("all cached values")
print(list(load_cached_results(double)))

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

推荐PyPI第三方库


热门话题
java使用双一元运算符vs函数<Double,Double>   由于存在巨大的休眠,超出了java GC开销限制   java更改Tomcat中Apache文件上载的临时目录   当PDF位于本地驱动器时,javascript无法在IE中显示PDF   java hibernate如何加载瞬态对象?   java如何判断包属于哪个模块?   创建Word文档时java文件已损坏   java如何将Eclipse中的每个开放项目导出为自己的JAR?   java将带有getter和setter的变量添加到现有类中   java高效地发送多封电子邮件   java读/写。具有特殊字符的txt文件   java如何在导出到jar时包含opencv本机库   java Xstream在未完成时停止写入文件   if语句Java:无法检查布尔值是否为null   文本Java:读取txt文件并将其保存在字符串数组中,但不带反斜杠(空格)?   java如何使用正则表达式替换字符串的一部分   通过Java远程运行Powershell脚本   filenames带有xml文件空指针异常的Java文件uri