Измерение различных аспектов кода

Существует ли инструмент, который может измерять частоту вызовов функций в проекте и учитывает другие аспекты (для статистических целей) кода Python?

благодарю вас

3 ответа

Решение

Я думаю, вы хотите сделать статический анализ кода. Сколько мест в вашем коде вызывает функцию.

Это очень трудно сделать в динамических языках, таких как python, потому что существует множество способов вызова функций иначе, чем по собственному имени, и даже компилятор байт-кода python не всегда будет знать, какая функция будет вызываться в месте, и это может даже измениться во время исполнения. И есть стандартный ОО полиморфизм тоже.

Рассматривать:

def doublefx(f, x):
    return f(x)*2

print doublefx(math.sqrt, 9)  # 6 

f = stdin.readline()
print doublefx(getattr(math, f), 9)  # ?

Никакой инструмент статического анализа никогда не узнает, какие функции в математике. * Будут вызываться этим кодом. Даже первый пример будет очень трудно рассуждать, второй невозможно.

Следующий инструмент выполняет статический анализ сложности.

Другие инструменты анализа, такие как PyLint и PyChecker, скорее фокусируются на стиле и возможных ошибках.

Профилировщик Python должен предоставить вам немного информации:

python -m cProfile -o fooprof myscript.py

Вы загружаете результаты, используя простой скрипт:

#!/usr/bin/env python
import pstats
p = pstats.Stats('fooprof')
p.strip_dirs().sort_stats(-1).print_stats()

В качестве альтернативы, если вы не укажете -o fooprof результаты выводятся на стандартный вывод.

См. Документацию по адресу http://docs.python.org/library/profile.html

Я не уверен, какие "другие аспекты" вы хотите посчитать, но это определит, сколько раз вызывается функция. Если вас интересует "частота" вызовов, то вы можете найти среднюю частоту как функцию общего времени выполнения и количества вызовов функции. Например:

предполагать foo() был вызван 100 раз за 10 секунд. Средняя частота звонков составляет 10/ секунду.

Я никогда не использовал его, но похоже, что cProfile может быть хорошим местом для начала. (Обратите внимание, что из трех профилировщиков, упомянутых на этой странице, один (горячий) является экспериментальным и не очень хорошо поддерживается, один (профиль) "добавляет значительные накладные расходы к профилированным программам", а последний - cProfile, так что, вероятно, согласитесь с этим.) Ссылки на исходный код для profile.py а также pstats.py предоставляются в верхней части страницы.

Другие вопросы по тегам