Почему cProfile проходит через код только один раз? - PullRequest
1 голос
/ 28 октября 2019

С другой стороны, timeit пробегает код 1 000 000 раз, чтобы получить разумное асимптотическое сравнение с другим кодом. cProfile проходит через код только один раз, и только с 3-мя десятичными разрядами в результатах (0,000) недостаточно получить полную картину.

Вы получаете ненужные результаты, подобные этому:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
    1    0.000    0.000    0.000    0.000 <string>:1(<module>)
    1    0.000    0.000    0.000    0.000 a.py:27(function)
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

1 Ответ

2 голосов
/ 28 октября 2019

Цель timeit состоит в том, чтобы получить пропускную способность функции, которая всегда будет требовать многократного выполнения кода для затухания краевых случаев и получения хорошего среднего значения.

В то время как cProfile нас другой стороны, используется для профилирования каждого дополнительного вызова стека функции, чтобы демистифицировать всю магию, происходящую внутри функции.

timeit скажет вам, что для работы требуется некоторая оптимизация, в то время как cProfile укажет вам правильное направление, сообщив вам, какая незначительная часть стека сокращает ваше время обработки.

...