关闭调试打印
问题内容:
有时我在函数周围散布了许多打印输出调试输出。要切换此调试输出,我想到了:
def f(debug=False):
print = __builtins__.print if debug else lambda *p: None
或者,如果需要打印除调试消息以外的内容,则可以为调试消息创建dprint
函数。
问题是,当时debug=False
,此print
语句会大大降低代码的速度,因为lambda *p: None
它仍然被调用,并且已知函数调用的速度很慢。
因此,我的问题是:有没有更好的方法可以有效地禁用所有这些调试打印,而不影响代码性能?
所有答案都与我未使用logging
模块有关。这是一个很好的注意,但是 并没有回答 如何避免函数调用大大降低代码速度 的问题
-就我而言,是25次(如果可能的话)(例如,通过修改函数代码对象来消除所有print
语句或其他方式的行))。什么这些答案的建议是更换print
用logging.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
。