A logger is preferred in a formal project, because we can set different levels for different loggers, redirect log messages to files (even to remote servers), specify a unified format for logs and etc.
Recently I am using py-spy to create a flame graph for my program in order to find out which part is slow.
py-spy record -o profile.svg -- python a.py
After generating profile.svg
and view it using a browser, I found that there are a
lot of arrayprint
clauses from numpy package. The clauses are similar as following:
array = np.array([1,2,3,])
logger.debug(f"Array: {array}")
I have added a bunch of debug codes to help me find problems during the
developing stage. To me, it should not cause any performance problem if the log
level is higher than DEBUG
.
After reading the code, it is obvious that, use f-str
does not help here.
f-str
is the message, it is the log record itself.
Link. By default,
no LogRecord
is created if the corresponding level is not enabled.
A LogRecord
is created using string formatting.
def getMessage(self):
"""
Return the message for this LogRecord.
Return the message for this LogRecord after merging any user-supplied
arguments with the message.
"""
msg = str(self.msg)
if self.args:
msg = msg % self.args
return msg
if We change the log related code as following:
logger.debug("Array: %s", array)
There will be no LogRecord
created, no arrayprint
from numpy code will be called.
Have fun!