gpt4 book ai didi

python - 内存到磁盘 - python - 持久内存

转载 作者:IT老高 更新时间:2023-10-28 20:25:36 29 4
gpt4 key购买 nike

有没有办法将函数的输出内存到磁盘?

我有一个函数

def getHtmlOfUrl(url):
... # expensive computation

并且想做类似的事情:

def getHtmlMemoized(url) = memoizeToFile(getHtmlOfUrl, "file.dat")

然后调用getHtmlMemoized(url),这样每个url只做一次昂贵的计算。

最佳答案

Python 提供了一种非常优雅的方法——装饰器。基本上,装饰器是包装另一个函数以提供附加功能而不更改函数源代码的函数。你的装饰器可以这样写:

import json

def persist_to_file(file_name):

def decorator(original_func):

try:
cache = json.load(open(file_name, 'r'))
except (IOError, ValueError):
cache = {}

def new_func(param):
if param not in cache:
cache[param] = original_func(param)
json.dump(cache, open(file_name, 'w'))
return cache[param]

return new_func

return decorator

完成后,使用@-syntax '装饰'函数就可以了。

@persist_to_file('cache.dat')
def html_of_url(url):
your function code...

请注意,此装饰器是有意简化的,可能不适用于所有情况,例如,当源函数接受或返回无法进行 json 序列化的数据时。

有关装饰器的更多信息:How to make a chain of function decorators?

下面是如何让装饰器在退出时只保存一次缓存:

import json, atexit

def persist_to_file(file_name):

try:
cache = json.load(open(file_name, 'r'))
except (IOError, ValueError):
cache = {}

atexit.register(lambda: json.dump(cache, open(file_name, 'w')))

def decorator(func):
def new_func(param):
if param not in cache:
cache[param] = func(param)
return cache[param]
return new_func

return decorator

关于python - 内存到磁盘 - python - 持久内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463582/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com