IMHO、に与えられたメッセージerror
やwarn
あまり違いがないメッセージなど、表示される可能性が非常に高いメッセージの場合。
表示される可能性が低いメッセージについては、主にパフォーマンス上の理由から、間違いなく2番目のバージョンを選択します。私はしばしば大きなオブジェクトをパラメータとして与えますがinfo
、これはコストのかかる__str__
メソッドを実装します。明らかに、これを事前にフォーマットして送信info
すると、パフォーマンスが無駄になります。
アップデート
モジュールのソースコードをチェックしたところ、実際、ログレベルをチェックした後logging
にフォーマットが行われます。例えば:
class Logger(Filterer):
# snip
def debug(self, msg, *args, **kwargs):
# snip
if self.isenabledfor(debug):
self._log(debug, msg, args, **kwargs)
msg
それを観察することができargs
、呼び出しlog
とログレベルのチェックの間で変更されません。
更新2
Levonにスパイされて、コストのかかる__str__
メソッドを持つオブジェクトのテストをいくつか追加しましょう。
$ python -m timeit -n 1000000 -s "import logging" -s "logger = logging.getLogger('foo')" -s "logger.setLevel(logging.ERROR)" "logger.warn('%s', range(0,100))"
1000000 loops, best of 3: 1.52 usec per loop
$ python -m timeit -n 1000000 -s "import logging" -s "logger = logging.getLogger('foo')" -s "logger.setLevel(logging.ERROR)" "logger.warn('%s' % range(0,100))"
1000000 loops, best of 3: 10.4 usec per loop
実際には、これによりかなり高いパフォーマンスが向上する可能性があります。