如何解决使用显式执行选项将函数结果存储到磁盘
我正在尝试将函数的结果放在磁盘中,因此如果结果已经存储,我不需要重新运行该函数,但如果出现以下情况,我也需要选择重新运行它我想要。
因此,就我而言,我正在研究 ML 模型,我想按照描述的方式保存和加载这些模型。 为了做到这一点,我认为我需要使用包装器来添加参数和 joblib 以进行保存和加载,所以我找到了这三个方法:
1.函数制作装饰器
import joblib
from functools import partial,wraps
def Meta_decorator(joblib_Filename,explicit_run=False,compress=True):
def real_decorator(function):
@wraps(function)
def wrapper(*args,**kwargs):
filename = joblib_Filename
if compress:
filename += '.z'
if explicit_run :
My_Model = function(*args,**kwargs)
joblib.dump(My_Model,filename)
else :
try:
My_Model = joblib.load(filename)
except FileNotFoundError:
My_Model = function(*args,**kwargs)
joblib.dump(My_Model,filename)
return My_Model
return wrapper
return real_decorator
@Meta_decorator("joblib_ML_Model.joblib",False,False)
def make_model(data,parameters):
"""tune and fit the model and return it"""
pass
def _pseudo_decor(fun,joblib_Filename,compress=True):
# lift the name and doc of the function
@wraps(fun)
def ret_fun(*args,**kwargs):
filename = joblib_Filename
if compress:
filename += '.z'
if explicit_run :
My_Model = function(*args,**kwargs)
joblib.dump(My_Model,filename)
else :
try:
My_Model = joblib.load(filename)
except FileNotFoundError:
My_Model = function(*args,filename)
return My_Model
return ret_fun
real_decorator = partial(_pseudo_decor,\
joblib_Filename="Pickle_ML_Model.joblib",compress=False)
@real_decorator
def make_model(data,parameters):
"""tune and fit the model and return it"""
pass
3.使用装饰器的装饰器
def decorator_with_args(decorator_to_enhance):
"""
This function is supposed to be used as a decorator.
It must decorate an other function,that is intended to be used as a decorator.
It will allow any decorator to accept an arbitrary number of arguments,saving you the headache to remember how to do that every time.
"""
def decorator_maker(*args,**kwargs):
# We create on the fly a decorator that accepts only a function
# but keeps the passed arguments from the maker.
def decorator_wrapper(func):
# We return the result of the original decorator,which,after all,# IS JUST AN ORDINARY FUNCTION (which returns a function).
# Only pitfall: the decorator must have this specific signature or it won't work:
return decorator_to_enhance(func,*args,**kwargs)
return decorator_wrapper
return decorator_maker
# You create the function you will use as a decorator. And stick a decorator on it :-)
# Don't forget,the signature is "decorator(func,**kwargs)"
@decorator_with_args
def decorated_decorator(func,force_run=False,compress=True):
def wrapper(*args,**kwargs):
filename = joblib_Filename
if compress:
filename += '.z'
if force_run :
My_Model = func(*args,filename)
else :
try:
My_Model = joblib.load(filename)
except FileNotFoundError:
My_Model = func(*args,filename)
return My_Model
return wrapper
# Then you decorate the functions you wish with your brand new decorated decorator.
@decorated_decorator("joblib_ML_Model.joblib",parameters):
"""tune and fit the model and return it"""
pass
if explicit_run :
My_Model = func(*args,**kwargs)
joblib.dump(My_Model,filename)
else :
try:
My_Model = joblib.load(filename)
except FileNotFoundError:
My_Model = func(*args,**kwargs)
joblib.dump(My_Model,filename)
我想过类似的事情
try:
if explicit_run : raise FileNotFoundError("explicit_run")
My_Model = joblib.load(filename)
except FileNotFoundError:
My_Model = func(*args,**kwargs)
joblib.dump(My_Model,filename)
但我认为在这种情况下引发 FileNotFoundError 具有误导性。
注意:这只是我尝试过的,我完全接受任何其他可以在我的情况下使用的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。