装饰器将函数计算永久性地存储到磁盘上。
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)))
- 项目
标签: