gpt4 book ai didi

python - 惯用的 Python 日志记录 : format string + args list vs. 内联字符串格式 - 哪个是首选?

转载 作者:太空狗 更新时间:2023-10-29 17:24:32 24 4
gpt4 key购买 nike

使用格式字符串 + args 列表调用日志记录函数与格式化内联是否有利?

我看过(并写过)使用内联字符串格式的日志记录代码:

logging.warn("%s %s %s" % (arg1, arg2, arg3))

但我认为它更好(性能方面,更惯用)使用:

logging.warn("%s %s %s", arg1, arg2, arg3)

因为第二种形式在调用日志函数之前避免了字符串格式化操作。如果当前日志记录级别会过滤掉日志消息,则无需格式化,从而减少计算时间和内存分配。

我是在正确的轨道上,还是错过了什么?

最佳答案

恕我直言,对于很可能会显示的消息,例如给 errorwarn 的消息,它并没有太大的区别。

对于不太可能显示的消息,我肯定会选择第二个版本,主要是出于性能原因。我经常将大对象作为参数传递给 info,它实现了一个代价高昂的 __str__ 方法。显然,将此预格式化发送到 info 会浪费性能。

更新

我刚刚检查了logging 模块的源代码,确实,在检查日志级别后 格式化完成了。例如:

class Logger(Filterer):
# snip
def debug(self, msg, *args, **kwargs):
# snip
if self.isenabledfor(debug):
self._log(debug, msg, args, **kwargs)

可以观察到 msgargs 在调用 log 和检查日志级别之间没有被触及。

更新 2

在 Levon 的启发下,让我为具有昂贵的 __str__ 方法的对象添加一些测试:

$ python -m timeit -n 1000000 -s "import logging" -s "logger = logging.getLogger('foo')" -s "logger.setLevel(logging.ERROR)" "logger.warn('%s', range(0,100))"
1000000 loops, best of 3: 1.52 usec per loop
$ python -m timeit -n 1000000 -s "import logging" -s "logger = logging.getLogger('foo')" -s "logger.setLevel(logging.ERROR)" "logger.warn('%s' % range(0,100))"
1000000 loops, best of 3: 10.4 usec per loop

在实践中,这可以带来相当高的性能提升。

关于python - 惯用的 Python 日志记录 : format string + args list vs. 内联字符串格式 - 哪个是首选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com