关闭调试打印


问题内容

有时我在函数周围散布了许多打印输出调试输出。要切换此调试输出,我想到了:

def f(debug=False): 
    print = __builtins__.print if debug else lambda *p: None

或者,如果需要打印除调试消息以外的内容,则可以为调试消息创建dprint函数。

问题是,当时debug=False,此print语句会大大降低代码的速度,因为lambda *p: None它仍然被调用,并且已知函数调用的速度很慢。

因此,我的问题是:有没有更好的方法可以有效地禁用所有这些调试打印,而不影响代码性能?


所有答案都与我未使用logging模块有关。这是一个很好的注意,但是 并没有回答 如何避免函数调用大大降低代码速度 的问题
-就我而言,是25次(如果可能的话)(例如,通过修改函数代码对象来消除所有print语句或其他方式的行))。什么这些答案的建议是更换printlogging.debug,这应该是更慢。这个问题是关于完全摆脱那些函数调用。

我尝试使用logging代替lambda *p: None,并且毫无疑问,代码变得更慢了。


也许有人希望看到这些打印导致25个速度下降的代码:http :
//ideone.com/n5PGu

而且我对logging模块没有任何要求。我认为,始终坚持使用可靠的解决方案而不会受到任何
黑客入侵

是一种好习惯。但是我认为,如果我在20行的一次性代码段中使用这些 骇客 ,那就没有罪恶了。


不是一个限制,而是一个建议,也许可以print从函数源代码中删除一些行(例如,以开头)并重新编译它?我在下面的答案中列出了这种方法。尽管我希望对该解决方案发表一些评论,但我欢迎其他解决该问题的方法。


问题答案:

内德·巴切德尔Ned Batchelder
)在评论中写道:

我怀疑速度下降是在调试函数的参数计算中。您应该寻找避免这些计算的方法。预处理Python只是一种干扰。

他是正确的,因为速度减慢实际上是由使用format方法格式化字符串引起的,而无论是否记录结果字符串,该方法都会发生。

因此,如果不进行日志记录,则应推迟并取消字符串格式设置。这可以通过重构dprint功能或使用log.debug以下方式来实现:

log.debug('formatted message: %s', interpolated_value)

如果不记录消息,则不会对其进行格式化,这与不同print,在消息中始终对其进行格式化,而不管它是要记录还是丢弃。

log.debug推迟格式的解决方案在这里给了
Martijn Pieters