Что я получу от использования профиля или cProfile

1

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

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 пытается оценить время компиляции байткода и такое (и вычитает это время из времени выполнения), поэтому более конкретно.

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

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

2 ответа

1

Профиль и 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
    Я извиняюсь, что я имел в виду под своим комментарием: я узнаю, что cProfile и Profile вычитают время компиляции из фактического времени выполнения. Я собираюсь редактировать пост сейчас.
  • 0
    Я также отвечаю на ваш вопрос о том, что profile делает то, что ваша версия не делает. Он показывает построчно, сколько времени заняла ваша функция, сколько времени заняло выполнение каждой отдельной вещи, а не только общее время выполнения.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню