Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switching off debug prints

Tags:

python

Sometimes I have a lot of prints scattered around function to print debug output. To switch this debug outputs I came up with this:

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

Or if I need to print something apart from debug message, I create dprint function for debug messages.

The problem is, when debug=False, this print statements slow down the code considerably, because lambda *p: None is still called, and function invocation are known to be slow.

So, my question is: Is there any better way to efficiently disable all these debug prints for them not to affect code performance?


All the answers are regarding my not using logging module. This is a good to notice, but this doesn't answer the question how to avoid function invocations that slow down the code considerably - in my case 25 times (if it's possible (for example by tinkering with function code object to through away all the lines with print statements or somehow else)). What these answers suggest is replacing print with logging.debug, which should be even slower. And this question is about getting rid of those function calls completely.

I tried using logging instead of lambda *p: None, and no surprise, code became even slower.


Maybe someone would like to see the code where those prints caused 25 slowdown: http://ideone.com/n5PGu

And I don't have anything against logging module. I think it's a good practice to always stick to robust solutions without some hacks. But I thinks there is nothing criminal if I used those hacks in 20-line one-time code snippet.


Not as a restriction, but as a suggestion, maybe it's possible to delete some lines (e.g. starting with print) from function source code and recompile it? I laid out this approach in the answer below. Though I would like to see some comments on that solution, I welcome other approaches to solving this problem.

like image 332
ovgolovin Avatar asked Jan 16 '23 16:01

ovgolovin


1 Answers

You should use the logging module instead. See http://docs.python.org/library/logging.html

Then you can set the log level depending on your needs, and create multiple logger objects, that log about different subjects.

import logging
#set your log level
logging.basicConfig(level=logging.DEBUG)
logging.debug('This is a log message')

In your case: you could simply replace your print statement with a log statement, e.g.:

import logging
print = __builtins__.print if debug else logging.debug

now the function will only be print anything if you set the logging level to debug

logging.basicConfig(level=logging.DEBUG)

But as a plus, you can use all other logging features on top! logging.error('error!')

like image 126
devsnd Avatar answered Jan 19 '23 00:01

devsnd