这两个调用之间是否有区别:
a
和
import logging
logging.getLogger().debug('test: %i' % 42)
我们假设logging.getLogger().debug('test: {}'.format(42))
在转换为最终答案为42的字符串(例如750万年)时被一些冗长的计算所代替。
在日志记录设置为调试的情况下,是否会偷懒评估前一种方法?
答案 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()
都是经过计算的。