if debug: print~
部分であれば可能です。
_print() の対応は難しいです。(マクロ、メタプログラミングの領域)
解決策: if __debug__:
python
1# sample.py
2
3def main():
4 if __debug__:
5 print("debug log")
6
7if __name__ == "__main__":
8 main()
9
最適化オプション有 (python -O)で実行すると、
バイトコードへのコンパイル時点で if 文自体がなくなります。
ディスアセンブラでバイトコードを確認 Disassembly of code object main ... の部分
python3 -O -m dis sample.py
python3 -m dis sample.py
詳細は省きますが、print
の有無だけでも確認できると思います。
if 文は POP_JUMP_IF_FALSE という命令ですが、
if True, False, __debug__
等の組み込み定数の場合は、コンパイル時に定数として評価されるので、
本運用の実行時のパフォーマンスに影響しないデバッグログを実現できます。
ちなみに、Pythonには他に(コンパイル時評価可能な)定数を作る方法は無いはずなので、
質問のコードのように、自分で定義した変数 DEBUG には対応できません。
方法がないわけではなく、バイトコードや構文木操作で、
ユーザ変数を定数に変換する手法がありますが、
保守コストが高くつく(Python側の仕様変更に追従しなければならない)為、
導入を見送ったことがあります。
拡張機能としてその様な最適化を施した処理系もありましたが、
現存してるものはないと思います。
追記: 表示の on/off だけなら、標準ライブラリの logging モジュールを調べて見て下さい。
パフォーマンスの影響については完全には解消しませんが、(I/O 抑制だけで、関数呼び出しは発生する)
本運用・デバッグ時のログ表示の切り替えは行えます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/10 06:45 編集