Почему not not value БЫСТРЕЕ bool в Python?

  Переглядів 22,865

ZProger [ IT ]

ZProger [ IT ]

День тому

⭐ Курс ООП и Приват канал: www.zproger-school.com/?...
⭐ Телеграм канал: t.me/codeblog8
В данном видео узнаем почему not not value быстрее bool в Python. Рассмотрим примеры и сделаем тесты производительности.
Также стоит добавить, что вам не нужно использовать такую запись в вашем коде, хоть это и работает быстрее.
Но в процессе видео я покажу решение, как можно не используя not not value ускорить проверки на bool до такой же скорости.
📁 Github исходники: github.com/Zproger
📁 Все плейлисты с уроками: bit.ly/39GaY89
📁 Связаться со мной: zproger777@gmail.com
📁 Поддержать канал: github.com/Zproger/donate
Тайм-коды:
0:00 - О чем будет видео?
0:27 - Первое сравнение not not value и bool
2:33 - Какая причина того, что bool работает медленней?
3:30 - Что быстрее, код в функции или код вне функции?
4:00 - Что не так с классом bool?
5:45 - Что быстрее? Создание экземпляра на bool или ссылки на объект?
6:36 - Сравниваем bool и оператор not в дизассемблере
8:17 - Самое странное поведение bool. Финальный пример

КОМЕНТАРІ: 48
@Lord_Nodus
@Lord_Nodus Рік тому
Вывов функции bool в main отжирает время, то что bool функция, а не оператор, как not, не влияет на скорость. Я сейчас проверил, создал класс, где переопредилил магический метод __bool__, чтобы он вергда возвращал False и печатал сообщение о своём запуске, при использовании not и bool в концоль печаталось сообщение, получается оба механизма заускают метод bool. После сделал тесты not not и bool, разница была в 20%. Я проверил id объектов и понял, что в питоне всего 2 объекта bool с True и False, даже если мы сделаем новую переменную, у неё будет ссылка на 1 из этих объектов. После я проверл на скорость not единичную и not not, скорость минимально поменялась, и решил проверить bool(bool()), и вот тут уже появилсоь сильное падение, примерно 15%
@vas_._sfer6157
@vas_._sfer6157 Рік тому
А если напрямую вызывать __bool__?
@zrxmax_
@zrxmax_ 8 місяців тому
Сразу пришла в голову такая идея, переопределить bool: bool = lambda x: not not x
@user-hf6zn6mu9f
@user-hf6zn6mu9f Рік тому
если один раз использовать bool где-то в программе, то тогда он будет работать быстрее чем not not, ибо он не имеет отношение к кешированию, а bool и результат, и информацию о себе один раз заводит в память и интерпретатор на него только ссылается, то при not not он все эти четыре операции вызывает каждый раз, когда bool, только первый раз, остальные он из кеша достает
@m0Ray79
@m0Ray79 Рік тому
Гораздо менее костыльно использовать типизированные разновидности языка, например, Cython.
@Devil666face
@Devil666face Рік тому
Может я что то не понял, но: 1. Зачем выражение типа bool оборачивать в функцию bool. 2. Если ты боишься что в функцию придет не bool. Можно проверить это через типизацию :bool. 3. Питон вроде целью ставит читаемость кода не разу в жизни не видел не в одной библиотеке not not
@lowfolen9827
@lowfolen9827 Рік тому
Есть люди которым крайне важна скорость, поэтому когда статьи "как оптимизировать код на питоне" где самый полезный совет это умение правильно определять где использовать кортеж, а где список - закончились, то люди ищут подобные штуки.
@gth-other2078
@gth-other2078 Рік тому
@@lowfolen9827 >важна скорость >питон
@vas_._sfer6157
@vas_._sfer6157 Рік тому
@@lowfolen9827 Подобная штука может работать просто в сверх горячем цикле. На столько горячем, что его бы стоило переписать на Rust
@geckwwo
@geckwwo Рік тому
Типизация никогда не обещает, что входное значение будет равно указанному типу, указания типов игнорируется компилятором
@t_fomina
@t_fomina Рік тому
спасибо за информацию
@sergeysharov350
@sergeysharov350 Рік тому
Интересно было бы ещё узнать почему цикл for c else работает медленнее, чем for с какой-нибудь другой проверкой на то, дошёл ли он до конца. У меня как-то было, что в задаче на литкоде из-за этого код работал буквально в десять раз медленнее.
@curly7512
@curly7512 Рік тому
Спасибо чувак!
@zproger
@zproger Рік тому
Пожалуйста =))
@nickolayfetlistov4416
@nickolayfetlistov4416 Рік тому
По сути это как с Truncate в SQL, в bool очень много производится операций, создание, занос в ячейку памяти, а оператор втупую делает то, что ему говорят, по сути как я сказал выше, тут как с truncate и delete в sql, delete всегда смотрит на условия, когда truncate тупо выполняет
@bot_N666
@bot_N666 Рік тому
Я кончно начинающий, но я это понимаю так, что при not not val: 1.возвращает проверку значения на true 2. Возвращает обратное bool(val) 1.возвращает проверку значения на true 2.приводит к новому типу данных То есть независимо от одинаковости результата вы делаете разные задачи. А самое тупое, зачем все это? Так никто и не будет делать. Ибо: if val будет всегда быстрее чем if not not val!
@user-fe1dd4bd8f
@user-fe1dd4bd8f Рік тому
Питон странный язык. По идее в обоих случаях мы имеем, что всё равно будет выполняться тестирование истинности значение, которое сводится к вызову метода __bool__ из определения класса, причем два раза для not not, что должно было сделать not not медленнее. Похоже, что для встроенных типов тестирование истинности обходится без вызова метода __bool__. Похоже, что виртуальная машина питона настолько неэффективна, что у себя в нутрях пройти truth testing path второй раз дешевле, чем вызвать функцию. И всё же, имеет смысл попрогонять тесты для разных скалярок. Для чисел больше 255 (которые не интернируются, если это вдруг важно), для вещественных чисел, для пользовательских типов с методом __bool__ и без и на разных версиях питон. П. С. Короче хрен с ютубом, я не знаю как эти _ экранировать, но вы поняли
@notOnlyPython
@notOnlyPython Рік тому
🤝
@zproger
@zproger Рік тому
=))
@erlan4123
@erlan4123 Рік тому
Дамы и господа помогите пожалуйста. Почему-то не работает поиск по фото в pyautogui Весь день просидел не смог найти ответ. Выдаёт ошибку в исходном коде библиотеки
@tagireminov8858
@tagireminov8858 Рік тому
блин.. столько пишу на питоне и только сейчас узнал.. спасибо!
@zproger
@zproger Рік тому
😉
@disik603
@disik603 Рік тому
Я не разбираюсь в програмировании, но чуть чуть разбираюсь в основных логических элементах и мне кажется это потому что not not- это двойное отрицание, т.е двойной лог. элемент "не". А по своей сути "не" переворачивает сигнал из за чего мы и получаем противоположный результат, но он не только его переворачивает но и усиливает, т.к "не" это усиливающий каскад, а повторяя элемент "не" мы просто переворачиваем сигнал также на 180 градусов. Если моя догадка дошкольника не верна, то извиняюсь...
@disik603
@disik603 Рік тому
Ладно, ничего не понял в видео. Но извиняюсь
@user-fe1dd4bd8f
@user-fe1dd4bd8f Рік тому
Не, тут так не работает. Ты что-то из электротехники рассказываешь.
@sadist3128
@sadist3128 Рік тому
То есть код написанный в одном файле(одной функции) будет в теории быстрей чем код структурированный, разнесённый на многие файлы и функции?
@fab4key
@fab4key Рік тому
Ну да
@zproger
@zproger Рік тому
Да, но вы ведь видели сколько итераций я ставил? Если каждая ваша функция будет выполняться 100млн раз, то да, на пару секунд будет медленней) Но не стоит жертвовать читаемостью ради этих пару секунд
@inferrna
@inferrna Рік тому
Если всё настолько плохо, что руки тянутся писать нечитаемую кашу ради прироста скорости, возможно стоит присмотреться к другим языкам.
@zproger
@zproger Рік тому
Это не нужно писать) Мы просто рассматриваем почему это быстрее с технической части
@fab4key
@fab4key Рік тому
пон
@rarogcmex
@rarogcmex Рік тому
Приходите к нам в плюсы! У нас такого нет, так как есть LTO!
@mslq
@mslq Рік тому
А можно помедленней?, я записываю.
@-wx-78-
@-wx-78- Рік тому
Всеми богами клянусь: пайтоновцы знают сишную фишку !! и оптимизируют. А сравнение производительности… мля, когда бои были на ассемблере - влиял разогрев кэша всех уровней и особенности архитектуры. Срались аки львы. 😉 А по теме - bool(x) вынужденно создаёт новое значение, нот-ноту же достаточно понять falsy/truthy.
@XpIOHdeJIb3000
@XpIOHdeJIb3000 Рік тому
в питухоне даже бул работает очень медленно
@lime-qh6el
@lime-qh6el Рік тому
Ок
@zproger
@zproger Рік тому
Ок =)
@user-up5fp8nh9g
@user-up5fp8nh9g Рік тому
Так это же менее читаемо. Зачем оно? Для олимпиадников?
@zproger
@zproger Рік тому
А я и не говорил что это нужно использовать, в конце видео я показал что эту конструкцию оптимизировали для повседневных задач. А в видео мы просто сравниваем скорость.
@user-mi1cy4qp3t
@user-mi1cy4qp3t Рік тому
зачем вобще True превращать в True
@user-fe1dd4bd8f
@user-fe1dd4bd8f Рік тому
Так дело в том что не True в True. В питоне значение любого типа может обладать истинотным значением и конвертироваться в bool
@oleg-medovikov
@oleg-medovikov Рік тому
почему нельзя возвращать не not not value, а просто value ? думаю интерпретатор просто игнорит двойной not not
@user-xb2dv2ew6j
@user-xb2dv2ew6j Рік тому
Костыльный язык
@zproger
@zproger Рік тому
Не совсем, если так глубоко копать как в видео, то тогда любой язык можно назвать костылем
@user-xb2dv2ew6j
@user-xb2dv2ew6j Рік тому
@@zproger ну извините меня, такая примитивная задача как проверка на истинность, и костыль оптимизации этой задачи…
@qts
@qts Рік тому
Очевидную вещь растянул на 10 минут
@plathardstuck28
@plathardstuck28 Рік тому
Чел, спасибо, конечно, но это видео выглядит демагогией на пустом месте.
@srjsibg6osdaab946
@srjsibg6osdaab946 Рік тому
:) p3d_in - как преобразовать *.bin в three.js, then *.obj (bin зашифрован?) на git: convert_me_back_0.2
LIVE - Парад Победы в Москве. 9 Мая 2024
2:27:56
AKIpress news
Переглядів 2,2 млн
🔥 Україна виходить у ФІНАЛ ЄВРОБАЧЕННЯ-2024! Реакція alyona alyona та Jerry Heil #eurovision2024
00:10
Євробачення Україна | Eurovision Ukraine official
Переглядів 306 тис.
Как выучить Python БЫСТРО используя ChatGPT?
10:10
ZProger [ IT ]
Переглядів 336 тис.
ПАРСИНГ КОМПАНИЙ В 2GIS | Как написать парсер на selenium (Python)
9:02
Артём Ипатов - Python на практике
Переглядів 3,9 тис.
Как избавиться от циклов импорта в Python
13:09
ТОП 8 Редких и Удобных фишек в Python
10:57
ZProger [ IT ]
Переглядів 27 тис.