有时我有很多打印分散在函数周围来打印调试输出。
为了切换这个调试输出,我想出了这个:
def f(debug=False):
print = __builtins__.print if debug else lambda *p: None
或者,如果我需要打印除调试消息之外的其他内容,我会创建dprint
调试消息的函数。
问题是,当debug=False
, this print
语句会大大减慢代码速度,因为lambda *p: None
仍然被调用,并且已知函数调用很慢。
所以,我的问题是:有没有更好的方法来有效地禁用所有这些调试打印,以免影响代码性能?
所有的答案都是关于我不使用logging
模块。值得注意的是,但这没有回答问题如何避免函数调用大大减慢代码速度 - 在我的例子中是 25 次(如果可能的话)(例如通过修改函数代码对象来删除所有带有print
陈述或其他方式))。这些答案表明正在替换print
with logging.debug
,这应该更慢。这个问题是关于完全摆脱这些函数调用。
我尝试使用logging
代替lambda *p: None
,毫不奇怪,代码变得更慢。
也许有人想看看那些打印导致 25 速度减慢的代码:http://ideone.com/n5PGu
我没有什么反对的logging
模块。我认为始终坚持使用稳健的解决方案而不需要某些解决方案是一个很好的做法hacks。但我认为如果我使用这些就没有什么犯罪行为hacks在 20 行一次性代码片段中。
不是作为限制,而是作为建议,也许可以删除一些行(例如以print
)从函数源代码并重新编译它?我在下面的答案中阐述了这种方法。尽管我希望看到有关该解决方案的一些评论,但我欢迎其他方法来解决此问题。