Подтвердить что ты не робот

Как профилировать мой код?

Я хочу знать, как профилировать мой код.

Я прошел через документы, но поскольку примеров не было, я ничего не смог получить от него.

У меня большой код, и он занимает так много времени, поэтому я хочу профилировать и увеличивать скорость. Я не написал свой код в методе, между ними немного, но не полностью. У меня нет основного кода. Я хочу знать, как использовать профилирование. Я ищу пример или пример кода о том, как профиль.

Я попробовал psyco, а просто добавил две строки вверху моего кода:

import psyco
psyco.full()

Правильно ли это? Это не улучшилось. Просьба указать другой способ ускорения.

4b9b3361

Ответ 1

Стандартный ответ на этот вопрос - использовать cProfile.

Вы найдете хотя бы , не разделяя ваш код на методы, которые cProfile не даст вам особенно богатой информации.

Вместо этого вам может понравиться попробовать другой плакат, который здесь называется Профилирование по методу Монте-Карло. Цитировать из еще один ответ:

Если вы спешите, и можете вручную прервать вашу программу в отладчик, пока он субъективно медленно, там просто способ найти проблемы с производительностью.

Просто остановите его несколько раз, и каждый Посмотрите на стек вызовов. Если есть это какой-то код, процент времени, 20% или 50% или независимо от того, что есть вероятность того, что вы поймете это в действии по каждому образец.. Это примерно соответствует процент образцов, по которым вы это увидит. Нет образованных требуется догадка. Если у вас есть догадайтесь, в чем проблема, это докажет или опровергнет это.

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

Предостережение: программисты, как правило, скептически относится к этой технике, если только они сами использовали это. Они будут скажите, что профилировщики дают вам это информации, но это верно только в том случае, если они пробуют весь стек вызовов. Графики вызовов не дают вам одинаковых информации, поскольку 1) они не суммировать на уровне инструкций, и 2) они дают путаные резюме в присутствии рекурсии. Oни также скажет, что он работает только на игрушке программ, когда на самом деле он работает любая программа, и, похоже, она работает лучше по более крупным программам, потому что у них, как правило, больше проблем с найти [выделено мной].

Это не ортодоксально, но я использовал его очень успешно в проекте, где профилирование с использованием cProfile не давало мне полезного вывода.

Самое лучшее в этом - это то, что это легко сделать в Python. Просто запустите Python script в интерпретаторе, нажмите [Control-C], обратите внимание на трассировку и повторите несколько раз.

Ответ 2

Изменить:

Этот ответ был реализован в https://github.com/campos-ddc/cprofile_graph

Профилирование с помощью cProfile

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

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

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

Профилирование модуля

Чтобы использовать cProfile для профилирования всего модуля, просто используйте следующую команду в приглашении:

python -m cProfile -o output_filename.pstats path/to/script arg1 arg2

Это запустит ваш модуль с данными аргументами (они являются необязательными) и выгрузит вывод в файле output_filename.pstats.

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

Профилирование изнутри

Иногда вы не хотите профилировать весь модуль, всего несколько строк.

Для этого вам нужно добавить код в свой модуль.

Прежде всего:

import cProfile

И затем вы можете заменить любой сегмент кода следующим:

cProfile.runctx('Your code here', globals(), locals(), 'output_file')

Например, вот тест до и после профилирования:

import unittest

class Test(unittest.TestCase):

    def testSomething(self):
        self.DoSomethingIDontCareAbout()

        param = 'whatever'
        self.RunFunctionIThinkIsSlow(param)

        self.AssertSomeStuff() # This is after all, a test

После:

import unittest
import cProfile

class Test(unittest.TestCase):

    def testSomething(self):
        self.DoSomethingIDontCareAbout()

        param = 'whatever'
        cProfile.runctx(
            'self.RunFunctionIThinkIsSlow(param)',
            globals(),
            locals(),
            'myProfilingFile.pstats'
        )

        self.AssertSomeStuff() # This is after all, a test

Преобразование файла pstats в график

Чтобы преобразовать файл профилирования в график, вам понадобится несколько вещей:

  • gprof2dot: этот модуль преобразует ваш вывод в файл dot, стандартный формат файла для описания графиков.
  • GraphViz: он превращает ваш файл точка в изображение.

После того, как вы загрузили gprof2dot и установили GraphViz, запустите эту команду в своем приглашении:

python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png

Возможно, вам придется использовать полный путь для gprof2dot и/или dot, или вы можете добавить их в свою переменную env PATH.

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

results example

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

  • На каждом node вы можете увидеть, какой процент от общей используемой функции времени выполнения и сколько раз он был вызван.

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

Примечание: проценты не всегда будут составлять до 100%, особенно в разделах кода, которые ссылаются на код С++, который не будет профилироваться. cProfile также не сможет определить, что вызвано изнутри оператора eval, поэтому вы можете увидеть некоторые прыжки в вашем графике.

Ответ 3

Используйте cProfile. Вы можете использовать его из командной строки и передать в свой модуль в качестве параметра, поэтому вам не нужен метод main.