Форум сайта python.su
я все время писал на пхп и проверял значения или индексы массивов с помощью функций, типа sizeof, isset, in_array
но изучая питон, я постоянно вижу что вместо таких проверок везде стоят try-except конструкции
появилась догадка, что этот способ позволяет ускорить быстродействие, засчет отказа от выполнения функций-проверок
ведь они выполняются всегда, даже если потом все ОК и работа идет дальше
как вы считаете, правильная догадка или есть другие причины юзать перехват исключений вместо проверок значений?
правда один очевидный минус этих перехватов - ужасно раздутый код
по-крайней мере у меня такой сейчас получается, если вставлять обработчики везде где возможен фейл
Офлайн
ИгнатБыстродействие этот способ не увеличивает, но зато делает код понятным и гибким.
что этот способ позволяет ускорить быстродействие,
Офлайн
ИгнатСкорее наоборот. try-except выполняется медленне, чем проверка значений. Чтобы понять, нужно углубится в то, как они реализовываются на уровне интерпретатора/виртуальной машины (и это характерно не только для Python). Интерпретатору приходится запоминать свое состояние и при возникновении ошибки в блоке try возвращаться назад (по буржуйски - upwinding). Из-за этого и тормоза.
оявилась догадка, что этот способ позволяет ускорить быстродействие, засчет отказа от выполнения функций-проверок
ведь они выполняются всегда, даже если потом все ОК и работа идет дальше
Отредактировано (Янв. 31, 2011 12:09:10)
Офлайн
Блок try/except без инициации исключений работает так же быстро, как если бы его не было вообще. А вот в случае генерации ошибки и его вылавливания, это уже медленно. try/except рекомендуется ставить тогда, когда подразумевается правильное выполнение программы (это не значит, что ошибки не предсказуемые, а значит, что они, скажем так, редки). Например, мы открываем файл для получение каких-либо данных, считая, что так и должно быть, нам нужны эти данные и мы расчитываем их получить. Но тут вдруг оказывается, что такого файла нет. Самое время заключить этот кусок кода в скобки try/except и не мешать в одну кучу сам код и проверку на существования файла.
Отредактировано (Янв. 31, 2011 13:12:16)
Офлайн
Первое. Производительность нужно измерять. Профайлером и всяко, для вашего конкретного кода.
Второе… А зачем второе, если первое все равно никто не делает?…
Читают, что “обработка исключения вчетверо дольше”… И как это соотносится со скоростью выполнения программы?
Например: “код на С в тысячу раз быстрее кода на <<подставьте нужное>>”. А я сумею написать на том же С такое, что будет в миллион раз медленней любой альтернативы - и что с того?
Офлайн
Андрей СветловВот если бы вы написали: “А я сумею написать на том же С такое, что будет в миллион раз быстрее любой альтернативы”, вот это было бы другое дело.
. А я сумею написать на том же С такое, что будет в миллион раз медленней любой альтернативы
Офлайн
> польза от try-except?
большая польза и куча применений.
вот пример не с ошибкой - есть какие-то функции для поиска какого-то значения и когда значение найдено, вместо кучи return'ов из ф-ии в ф-ию можно просто вызвать raise ResultFinded('hello') и программа сразу переходит в нужную точку программы:
# coding: utf8
import time
class ResultFinded(Exception):
pass
def loop():
while True:
time.sleep(0.5)
raise ResultFinded('hello')
def main():
print '1'
loop()
print '2'
try:
main()
except ResultFinded as e:
print 'find',e
Офлайн
Это такой аналог goto получился.
Офлайн
java developer detected =)
Офлайн
and cured :)
Офлайн