python日志记录中字符串的惰性求值:将%%与.format比较

时间:2018-08-24 22:47:29

标签: python string logging

这两个调用之间是否有区别:

a

import logging

logging.getLogger().debug('test: %i' % 42)

我们假设logging.getLogger().debug('test: {}'.format(42)) 在转换为最终答案为42的字符串(例如750万年)时被一些冗长的计算所代替。

在日志记录设置为调试的情况下,是否会偷懒评估前一种方法?

2 个答案:

答案 0 :(得分:5)

两个都不懒。在发送到记录器之前,将对这两个字符串进行插值。 python日志记录中的惰性评估是通过单独的参数完成的。 https://docs.python.org/2/library/logging.html文档建议对字符串插值进行延迟评估;

logging.getLogger().debug('test: %i', 42)

TL; DR 在这种情况下,考虑以下内容比较容易。我们向记录器发送了一个原始类型(字符串),但只有一个参数。因此,它不能偷懒。

答案 1 :(得分:2)

我将查看我在评论中发布的参考文献,以获取有关%.format()的更多详细信息。

对于懒惰的评估问题,答案为

一个简单的测试就可以了

def func1(x):
    time.sleep(5)
    return(x)

def func2(x):
    #time.sleep(5)
    return(x)

%timeit 'debug1: %s' % func1(3)
5 s ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit 'debug2: {}'.format(func1(3))
5 s ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit 'debug1: %s' % func2(3)
297 ns ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit 'debug2: {}'.format(func2(3))
404 ns ± 4.56 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

.format(显然)和%这两种方法中,func()都是经过计算的。