微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用显式执行选项将函数结果存储到磁盘

如何解决使用显式执行选项将函数结果存储到磁盘

我正在尝试将函数的结果放在磁盘中,因此如果结果已经存储,我不需要重新运行该函数,但如果出现以下情况,我也需要选择重新运行它我想要。

因此,就我而言,我正在研究 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

2.使用partial方法给装饰器添加参数

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 举报,一经查实,本站将立刻删除。