首页 > 解决方案 > 如何让 python 在运行 .py 文件时跳过某些代码块?

问题描述

我正在做超参数调整、特征选择、训练和拟合一些模型来评估哪个是最好的模型。所以可能有几百行代码。然而,我们可能知道,超参数调整部分通常需要数小时才能生成用于我们模型的最佳参数的输出。我的代码中还有其他部分需要 1 或 2 分钟来详细说明输出。

如果我要将此 .py 文件传递​​给某人,当该人单击“运行”时,我如何要求 python 跳过我的 .py 文件中的某些代码块(需要很长时间才能运行)?所以简而言之,这个人不需要运行需要数小时的调整部分和需要超过 3 分钟才能生成输出的其他部分,但他将能够预测我的模型并使用最佳超参数获得分数我之前调过的?

感谢是否有人可以提供任何关于我如何编码或提出更好方法的示例,因为我对编码仍然相对较新。

先感谢您!

标签: python

解决方案


简单的答案

简单的方法,使用标志:

#!/usr/bin/python

RUN_TUNING = False

if RUN_TUNING:
    # slow tuning code here

# rest of the code here

然后,根据您运行脚本的方式,您可以对标志进行硬编码,或将其绑定到用户输入:

RUN_TUNING = input('Run tuning? (y/N): ').lower() in ['y', 'yes']

或者可能是脚本参数(例如,使用argparse或许多可用替代方法之一)

更复杂代码的替代方案

如果您有复杂的代码,您可以将其组织在函数中以便更好地运行单独的部分,这里有一个更精细的选项,使用装饰器可以轻松地打开/关闭函数:

class SupervisedRun(object):
    run = False
    def __init__(self, func):
        self.func = func
        
    def __call__(self, *args, **kwargs):
        if self.run:
            return self.func(*args, **kwargs)
    
    
@SupervisedRun
def tuning_function1():
    print('I am only running when run=True')

def non_supervised_function1():
    print('I am always running')
    
@SupervisedRun
def tuning_function2():
    print('I am only running when run=True')

def non_supervised_function2():
    print('I am always running')

    
    
if __name__ == '__main__':
    SupervisedRun.run = input('Run tuning? (y/N): ').lower() in ['y', 'yes']

    tuning_function1()
    non_supervised_function1()
    tuning_function2()
    non_supervised_function2()

推荐阅读