/ / Ako vytvoriť voliteľný dekoratér v Pythone - python, profilovanie, python-decorators

Ako vytvoriť voliteľný dekorátor v Pythone - python, profiling, python-decorators

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ď č. 1

Definujte 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