Mám sadu python skriptov, ktoré by som rád profiloval s kernprof https://github.com/rkern/line_profiler ale chcem byť schopný ho spustiť aj počas normálneho vykonávania bez kernprofu.
Aký je elegantný spôsob ignorovania nedefinovaného @profilu počas vykonávania bez kernprofu? Alebo iný dekoratér.
Príkladový kód:
@profile
def hello():
print("Testing")
hello()
Beží s:
kernprof -l test.py
Správne vykoná profiler na metódach @profile
Beží s:
python test.py
Vracia chybu:
Traceback (most recent call last):
File "test.py", line 1, in <module>
@profile
NameError: name "profile" is not defined
Chcel by som sa vyhnúť tomu, aby sa táto chyba zachytila všade, pretože chcem, aby sa kód spustil, ako keby bol @profile no-op, keď nie je volaný s kernprof.
Vďaka! -Laura
Edit: Skončil som pomocou cProfile s kcachegrind a vyhnúť sa dekoratérov úplne.
Použitie výsledkov cProfile s KCacheGrind
python -m cProfile -o profile_data.pyprof run_cli.py
pyprof2calltree -i profile_data.pyprof && qcachegrind profile_data.pyprof.log
odpovede:
6 pre odpoveď č. 1Definujte neautorického dekorátora, ak nie je spustený z kernprof:
if "profile" not in globals():
def profile(func):
return func
-1 pre odpoveď č. 2
Variantom oproti metóde navrhovanej Danielom by bolo použiť nasledujúcu liniovú linku a potom ju komentovať a odoberať v závislosti od potreby profilovania alebo nie:
# Optional no-op decorator, comment when you want to profile
def profile(func): return func