Что я получу от использования профиля или cProfile - PullRequest
1 голос
/ 20 августа 2011

против чего-то вроде этого:

def time_this(func):
    @functools.wraps(func)
    def what_time_is_it(*args, **kwargs):
        start_time = time.clock()
        print 'STARTING TIME: %f' % start_time
        result = func(*args, **kwargs)
        end_time = time.clock()
        print 'ENDING TIME: %f' % end_time
        print 'TOTAL TIME: %f' % (end_time - start_time)
        return result
     return what_time_is_it

Я спрашиваю, потому что написание дескриптора, как это, кажется мне проще и понятнее. Я признаю, что profile / cprofile пытается оценить время компиляции байт-кода и тому подобное (и вычитает это время из времени выполнения), поэтому более конкретно.

Мне интересно:

  • а) когда время компиляции становится достаточно значительным для таких различия имеют значение?
  • б) Как мне написать собственный профилировщик, который учитывает время компиляции аккаунта?

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Профиль и cProfile не имеют ничего , связанного с оценкой времени компиляции. Они оценивают время выполнения .

Время компиляции не является проблемой производительности. Не хотите, чтобы ваш код компилировался при каждом запуске? import, и он будет сохранен как .pyc и перекомпилирован только в случае его изменения. Просто не имеет значения, сколько времени занимает компиляция кода (это очень быстро), так как это не нужно делать каждый раз, когда он запускается.

Если вы хотите рассчитать время компиляции, вы можете использовать пакет компилятора .

В основном:

from timeit import timeit
print timeit('compiler.compileFile(' + filename + ')', 'import compiler', number=100)

напечатает время, необходимое для компиляции filename 100 раз.

Если внутри func вы добавляете в некоторые списки, делаете некоторые дополнения, ищите переменные в словарях, profile скажет вам, сколько времени занимает каждая из этих вещей.

Ваша версия не говорит вам ничего из этого. Это также довольно неточно - время, которое вы получите, зависит от времени, которое требуется для поиска атрибута clock в time и последующего его вызова.

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

0 голосов
/ 12 ноября 2012

Профиль медленнее, чем cProfile, но поддерживает потоки.

cProfile намного быстрее, но AFAIK не будет профилировать потоки (только основной, остальные будут игнорироваться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...