Как подсчитать байт-коды в Python, чтобы я мог соответствующим образом изменить sys.setcheckinterval - PullRequest
1 голос
/ 17 ноября 2008

У меня есть приложение для сканирования портов, которое использует рабочие очереди и потоки.

Он использует простые TCP-соединения и тратит много времени на ожидание возврата пакетов (до полсекунды). Таким образом, потоки не должны полностью выполняться (то есть первая половина отправляет пакет, переключает контекст, делает вещи, возвращается в поток, в котором его ожидают сетевые данные).

Я подозреваю, что могу улучшить производительность, изменив sys.setcheckinterval по умолчанию на 100 (что позволяет выполнять до 100 байт-кодов перед переключением на другой поток).

Но, не зная, сколько байт-кодов фактически выполняется в потоке или функции, я слетаю вслепую, и простое угадывание значений, тестирование и опора на тестирование показывают измеримую разницу (что трудно, так как объем выполняемого кода минимален ; простое сокетное соединение, поэтому дрожание сети, скорее всего, повлияет на любые измерения больше, чем изменение sys.setcheckinterval).

Таким образом, я хотел бы выяснить, сколько байт-кодов содержится в определенных выполнениях кода (т. Е. Всего для функции или в выполнении потока), чтобы я мог сделать более интеллектуальные предположения о том, как установить sys.setcheckinterval.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2008

Для более высокого уровня (метод, класс), dis module должен помочь.

Но если нужно более мелкое зерно, трассировка будет неизбежна. Трассировка работает построчно, но объясненное здесь 1008 * - отличный способ глубже погрузиться на уровне байт-кода. Снимаю шляпу перед Недом Батчелдером.

2 голосов
/ 18 ноября 2008

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

1 голос
/ 17 ноября 2008

«Я подозреваю, что могу улучшить производительность, изменив sys.setcheckinterval»

Это редко работает. Правильное поведение не может зависеть от времени - вы не можете контролировать время. Небольшие изменения в ОС, оборудовании, уровне исправлений Python или фазе луны изменят поведение вашего приложения.

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

...