Профилирование Python В Windows, как вы игнорируете встроенные функции - PullRequest
3 голосов
/ 30 апреля 2010

Мне нигде не удалось найти это в Интернете. Я искал с помощью профилировщика, как лучше оптимизировать мой код, и при сортировке, из-за которой функции расходуют больше всего времени, такие вещи, как str (), print и другие подобные широко используемые функции, поглощают большую часть профиля. Каков наилучший способ профилировать программу на python для получения пользовательских функций только для того, чтобы увидеть, какие области их кода они могут оптимизировать?

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

1 Ответ

8 голосов
/ 30 апреля 2010

ОК, я полагаю, ваша реальная цель - сделать ваш код максимально быстрым, верно?

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

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

Предположим, что каждый "лист" занимает определенное время, и вы хотите обрезать дерево , чтобы удалить как можно больше листьев.

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

Один простой для этого способ сделать это - выбрать несколько листьев случайным образом, например, 10, и на каждом из них провести линию вниз по ее ветви до самого ствола. Любая точка ветвления будет иметь некоторое количество этих линий, проходящих через нее от листа к стволу. Чем больше линий проходит через эту точку ветвления, тем больше листьев на этой ветви, и тем больше вы можете сэкономить, обрезав ее.

Вот как вы можете применить это к своей программе. Чтобы сэмплировать лист, вы останавливаете программу наугад и смотрите на стек вызовов. Это линия обратно в багажник. Каждый сайт вызова на нем (не функция, сайт вызова) является точкой ветвления. Если этот сайт вызовов находится на некоторой доле выборок, например 40%, то это примерно столько, сколько вы могли бы сэкономить, обрезав его.

Так что не думайте об этом, как об измерении того, сколько времени занимают функции. Думайте об этом, как вопрос о том, какие сайты вызовов являются «тяжелыми». Вот и все, что нужно.

...