有时我会在函数周围散布很多打印件来打印调试输出。为了切换这个调试输出,我想出了这个:
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 行一次性代码片段中使用这些hack ,就没有什么犯罪行为。
print
不是作为限制,而是作为建议,也许可以从函数源代码中删除一些行(例如以 开头)并重新编译它?我在下面的答案中列出了这种方法。尽管我希望看到对该解决方案的一些评论,但我欢迎其他解决此问题的方法。