Игнат
Янв. 31, 2011 11:55:33
я все время писал на пхп и проверял значения или индексы массивов с помощью функций, типа sizeof, isset, in_array
но изучая питон, я постоянно вижу что вместо таких проверок везде стоят try-except конструкции
появилась догадка, что этот способ позволяет ускорить быстродействие, засчет отказа от выполнения функций-проверок
ведь они выполняются всегда, даже если потом все ОК и работа идет дальше
как вы считаете, правильная догадка или есть другие причины юзать перехват исключений вместо проверок значений?
правда один очевидный минус этих перехватов - ужасно раздутый код
по-крайней мере у меня такой сейчас получается, если вставлять обработчики везде где возможен фейл
Isem
Янв. 31, 2011 12:02:14
Игнат
что этот способ позволяет ускорить быстродействие,
Быстродействие этот способ не увеличивает, но зато делает код понятным и гибким.
regall
Янв. 31, 2011 12:08:33
Игнат
оявилась догадка, что этот способ позволяет ускорить быстродействие, засчет отказа от выполнения функций-проверок
ведь они выполняются всегда, даже если потом все ОК и работа идет дальше
Скорее наоборот. try-except выполняется медленне, чем проверка значений. Чтобы понять, нужно углубится в то, как они реализовываются на уровне интерпретатора/виртуальной машины (и это характерно не только для Python). Интерпретатору приходится запоминать свое состояние и при возникновении ошибки в блоке try возвращаться назад (по буржуйски - upwinding). Из-за этого и тормоза.
В общем случае использовать if-else нужно для предсказуемых ошибок, try-except - для непредсказуемых.
Isem
Янв. 31, 2011 13:08:39
Блок try/except без инициации исключений работает так же быстро, как если бы его не было вообще. А вот в случае генерации ошибки и его вылавливания, это уже медленно. try/except рекомендуется ставить тогда, когда подразумевается правильное выполнение программы (это не значит, что ошибки не предсказуемые, а значит, что они, скажем так, редки). Например, мы открываем файл для получение каких-либо данных, считая, что так и должно быть, нам нужны эти данные и мы расчитываем их получить. Но тут вдруг оказывается, что такого файла нет. Самое время заключить этот кусок кода в скобки try/except и не мешать в одну кучу сам код и проверку на существования файла.
Андрей Светлов
Янв. 31, 2011 13:54:19
Первое. Производительность нужно измерять. Профайлером и всяко, для вашего конкретного кода.
Второе… А зачем второе, если первое все равно никто не делает?…
Читают, что “обработка исключения вчетверо дольше”… И как это соотносится со скоростью выполнения программы?
Например: “код на С в тысячу раз быстрее кода на <<подставьте нужное>>”. А я сумею написать на том же С такое, что будет в миллион раз медленней любой альтернативы - и что с того?
Isem
Янв. 31, 2011 14:18:33
Андрей Светлов
. А я сумею написать на том же С такое, что будет в миллион раз медленней любой альтернативы
Вот если бы вы написали: “А я сумею написать на том же С такое, что будет в миллион раз быстрее любой альтернативы”, вот это было бы другое дело.
o7412369815963
Янв. 31, 2011 19:09:30
> польза от 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
certanista
Янв. 31, 2011 21:09:11
Это такой аналог goto получился.
regall
Янв. 31, 2011 21:10:32
java developer detected =)
Isem
Фев. 1, 2011 03:25:50
and cured :)