Python cprofile имя файла: белья получить полный путь

Я использую cprofile чтобы получить высокие правонарушители, однако filename:lineno только перечисляет имя файла, но наличие пути к файлу было бы более полезно, чтобы быстро открыть этот путь. Особенно, если в разных иерархиях могут быть одинаковые имена модулей.

ncalls    tottime    percall    cumtime    percall    filename:lineno(function)
1         0.000       0.000       3.922    display.py:599 (show)

Есть ли возможность превратить это в полный путь?

3 ответа

Я предполагаю, что вы форматируете вывод с классом "pstats.Stats", и у вас есть:

stats = Stats(profiler)
stats.strip_dirs()  # remove this

Если вы работаете с терминала, добавьте флаг -o:

      python -m cProfile -o output.data your_script.py ...

Затем из консоли:

      import pstats
ps = pstats.Stats('output.data')
ps.sort_stats(pstats.SortKey.CUMULATIVE).print_stats(20)

Вы должны получить такой результат:

      Tue Oct 19 07:17:56 2021    output.data

         18646457 function calls (18374990 primitive calls) in 30.760 seconds

   Ordered by: cumulative time
   List reduced from 22652 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   4321/1    0.037    0.000   30.796   30.796 {built-in method builtins.exec}
        1    0.000    0.000   30.796   30.796 manage.py:1(<module>)
      ...

Кажется, нет встроенного способа, но вы можете сделать это:

      import cProfile                                                    
import pstats   
                                                   
p = cProfile.Profile()                      
s = p.run("1+1")     
pstats.Stats(s).sort_stats(2).print_stats()
Другие вопросы по тегам