Найти - Пользователи
Полная версия: #define в python 2.6 есть?
Начало » Python для новичков » #define в python 2.6 есть?
1 2
Alex2ndr
Наткнулся тут на статью, которая частино относится к данной теме -
http://www.developers.org.ua/archives/mlk/2008/07/23/python-kung-fu-p1-runtime-compilation/
там достигается повышение производительности, за счет генерации грамотного байт-кода. Я пока в этом не копался, но в целом результат наверно похож на тот, который хотели получить от #define. Только все блин сложнее… Правильно там в начале написано - вместо профита можно пяткой в лоб получить :)
Ed
ZZZ
Не вижу проблем.
Это не значит, что их нет.
Вот вам образчик. Искусственный, конечно, но проблему показывает.
$ cat cost_of_debug.py 
import logging
logger = logging.getLogger()
for i in xrange(1000000):
i += 1
logger.debug('i = %d' % i)
i += 2
logger.debug('now i = %d' % i)

$ time python cost_of_debug.py

real 0m17.534s
user 0m17.410s
sys 0m0.032s

$ sed -i 's/logger\.debug/#logger.debug/g' cost_of_debug.py
$ cat cost_of_debug.py
import logging
logger = logging.getLogger()
for i in xrange(1000000):
i += 1
#logger.debug('i = %d' % i)
i += 2
#logger.debug('now i = %d' % i)
$ time python cost_of_debug.py

real 0m0.661s
user 0m0.646s
sys 0m0.011s
C/C++? :-)
По-моему прогнать код таким препроцессором станет чуть дешевле, чем переписывать куски на C/C++
Впрочем случаи разные бывают, как говорится. Но подход имеет право на жизнь.
Андрей Светлов
Alex2ndr, вы будете удивлены, как мало случаев требуют знания байткода.
Статья Сергея - неплохой пример эквилибристики. Читал в свое время с удовольствием.
Но это - практически бесполезная вещь.
Андрей Светлов
Уважаемый Ed, ваш пример совершенно некорректен.
Логирование используют для того, чтобы потом читать получившиеся простыни.
И резать вывод прийдется в первую очередь из этих соображений.
После того, как объем логов будет приведен к более или менее разумному значению, вопрос их производительности отпадет сам.

И вообще, никогда профайлер не указывал мне на систему логирования. На все что угодно, подчас самые неожиданные места. А логирование - никогда.

Кстати, господа оптимизаторы… Года два назад интересовался, кто использует профайлер в своей работе. Несколько человек ответили, что использовать - не используют, но обращаться с ним умеют. Остальная публика даже не пыталась.
Какая может быть оптимизация без измерений?
Что стоят измерения синтетических, высосанных из пальца примеров?
Ed
Андрей Светлов
Уважаемый Ed, ваш пример совершенно некорректен.
Логирование используют для того, чтобы потом читать получившиеся простыни.
Уважаемый Андрей, позвольте с вами не согласиться.
Пример искусственный, и я об этом написал. Но он не высосан из пальца. Если программа делает сложные и долгие рассчеты, то логирование вполне может влиять на производительность. Может и не так, как в примере, но существенно. Кроме того в примере вывода, как такового нет. Если мне не изменяет память, то по умолчанию уровень логгинга там WARNING, то есть в моих примерах никакого вывода logger.debug не производит, а только тормозит вычисления.
Rodegast
> Наткнулся тут на статью, которая частино относится к данной теме …. там достигается повышение производительности, за счет генерации грамотного байт-кода.

Для повышения производительности я запускаю питон с параметром -O или -OO, он генерит оптимизированный байткод.
Андрей Светлов
Rodegast
> Наткнулся тут на статью, которая частино относится к данной теме …. там достигается повышение производительности, за счет генерации грамотного байт-кода.

Для повышения производительности я запускаю питон с параметром -O или -OO, он генерит оптимизированный байткод.
Ага. Убирает docstrings и ставит __debug__ в False. Все.
Alex2ndr
Rodegast
Для повышения производительности я запускаю питон с параметром -O или -OO, он генерит оптимизированный байткод.
Насколько я помню там грошовая оптимизация:
1. при -O внутренняя переменная интерпретатора __debug__ устанавливается в 0( т е фактически отключен assert).
2. при -OO еще и убираются все докстринги
Реального прироста в скорости это все не дает.

PS Я не обновил страницу перед тем как запостил, а Андрей Светлов меня опередил :)
Андрей Светлов
Ed, я не утверждаю, что logging очень быстрый.
Скорее хочу сказать, что он достаточно хорош, чтобы им пользоваться.
И, как я уже писал, затык был где угодно, но не в логах.
Возможно, мне еще не попался такой случай.

Кстати, препроцессор для Питона, по моему мнению, идет вразрез с концептом языка. То же самое можно сделать обычными условными выражениями, вставленными в код модуля. Может, я опять что-то упускаю, но не вижу необходимости в этом велосипеде.
Ed
Да я и не утверждал, что logging - это зло, сам им пользуюсь регулярно. Однако допускаю, что в некоторых(может и редких) случаях обрезать препроцессором logging.debug не помешает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB