鉴于
有许多函数可以执行一些计算。在某些情况下(为了调试或监控过程),定期打印计算结果是很方便的。像这样:
def some_calculations(b, a):
print('Начали вычислять...')
# чего-то вычисляем
s = b + a
print(f'Закончили вычислять. Результаты: {s}')
print('Опять начали вычислять...')
# чего-то вычисляем
p = b * a
print(f'Закончили вычислять. Результаты: {p}')
# и тут таких или подобных итераций несколько
return s, p
但在某些情况下,为了不浪费时间在长时间的输出操作上,我需要禁用所有这些打印。首先,我想定义某种可以传递给这些函数的布尔变量,并在每次打印附近描述根据这个布尔变量是否输出/不输出的条件。但后来我想一定有办法可以关闭所有的打印。我没有依靠自己的知识,而是去寻找并找到了它。
# выключили
sys.stdout = open(os.devnull, 'w')
# включили
sys.stdout = sys.__stdout__
接下来,我决定测量执行时间
- 只是功能
- 输出关闭
- 打印被包装在取决于布尔标志变量的条件中的函数。
以下是带有标志的版本:
def some_calculations(b, a, flag = False):
if flag:
print('Начали вычислять...')
# чего-то вычисляем
s = b + a
if flag:
print(f'Закончили вычислять. Результаты: {s}')
if flag:
print('Опять начали вычислять...')
# чего-то вычисляем
p = b * a
if flag:
print(f'Закончили вычислять. Результаты: {p}')
# и тут таких или подобных итераций несколько
return s, p
测量结果表明,关闭输出的选项可使打印函数的执行时间缩短5 倍,而带有标志的选项可使执行时间缩短 65 倍。造成这种差异的原因很明显——开头指出的方法不会禁用打印,它仍然执行功能print
,仅输出到devnull
,也就是说,它只是抑制输出到控制台。并且标志绕过打印功能。
问题
是否有可能禁用某个函数(例如打印),而无需将每个函数调用包装在条件中,从而使禁用实际上绕过该函数,从而提供运行时好处,而不是简单地抑制输出?