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

  Рет қаралды 23,045

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. Финальный пример

Пікірлер: 51
@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__?
@bestia_show
@bestia_show Ай бұрын
@@vas_._sfer6157 особо ничего не изменится
@t_fomina
@t_fomina Жыл бұрын
спасибо за информацию
@curly7512
@curly7512 Жыл бұрын
Спасибо чувак!
@zproger
@zproger Жыл бұрын
Пожалуйста =))
@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 Жыл бұрын
Типизация никогда не обещает, что входное значение будет равно указанному типу, указания типов игнорируется компилятором
@zrxmax_
@zrxmax_ 11 ай бұрын
Сразу пришла в голову такая идея, переопределить bool: bool = lambda x: not not x
@bot_N666
@bot_N666 Жыл бұрын
Я кончно начинающий, но я это понимаю так, что при not not val: 1.возвращает проверку значения на true 2. Возвращает обратное bool(val) 1.возвращает проверку значения на true 2.приводит к новому типу данных То есть независимо от одинаковости результата вы делаете разные задачи. А самое тупое, зачем все это? Так никто и не будет делать. Ибо: if val будет всегда быстрее чем if not not val!
@sergeysharov350
@sergeysharov350 Жыл бұрын
Интересно было бы ещё узнать почему цикл for c else работает медленнее, чем for с какой-нибудь другой проверкой на то, дошёл ли он до конца. У меня как-то было, что в задаче на литкоде из-за этого код работал буквально в десять раз медленнее.
@user-hf6zn6mu9f
@user-hf6zn6mu9f Жыл бұрын
если один раз использовать bool где-то в программе, то тогда он будет работать быстрее чем not not, ибо он не имеет отношение к кешированию, а bool и результат, и информацию о себе один раз заводит в память и интерпретатор на него только ссылается, то при not not он все эти четыре операции вызывает каждый раз, когда bool, только первый раз, остальные он из кеша достает
@Putu_pererenan
@Putu_pererenan Ай бұрын
Кого он из кэша там достает, не объект случаем? 😆
@nickolayfetlistov4416
@nickolayfetlistov4416 Жыл бұрын
По сути это как с Truncate в SQL, в bool очень много производится операций, создание, занос в ячейку памяти, а оператор втупую делает то, что ему говорят, по сути как я сказал выше, тут как с truncate и delete в sql, delete всегда смотрит на условия, когда truncate тупо выполняет
@m0Ray79
@m0Ray79 Жыл бұрын
Гораздо менее костыльно использовать типизированные разновидности языка, например, Cython.
@erlan4123
@erlan4123 Жыл бұрын
Дамы и господа помогите пожалуйста. Почему-то не работает поиск по фото в pyautogui Весь день просидел не смог найти ответ. Выдаёт ошибку в исходном коде библиотеки
@tagireminov8858
@tagireminov8858 Жыл бұрын
блин.. столько пишу на питоне и только сейчас узнал.. спасибо!
@zproger
@zproger Жыл бұрын
😉
@user-fe1dd4bd8f
@user-fe1dd4bd8f Жыл бұрын
Питон странный язык. По идее в обоих случаях мы имеем, что всё равно будет выполняться тестирование истинности значение, которое сводится к вызову метода __bool__ из определения класса, причем два раза для not not, что должно было сделать not not медленнее. Похоже, что для встроенных типов тестирование истинности обходится без вызова метода __bool__. Похоже, что виртуальная машина питона настолько неэффективна, что у себя в нутрях пройти truth testing path второй раз дешевле, чем вызвать функцию. И всё же, имеет смысл попрогонять тесты для разных скалярок. Для чисел больше 255 (которые не интернируются, если это вдруг важно), для вещественных чисел, для пользовательских типов с методом __bool__ и без и на разных версиях питон. П. С. Короче хрен с ютубом, я не знаю как эти _ экранировать, но вы поняли
@notOnlyPython
@notOnlyPython Жыл бұрын
🤝
@zproger
@zproger Жыл бұрын
=))
@sadist3128
@sadist3128 Жыл бұрын
То есть код написанный в одном файле(одной функции) будет в теории быстрей чем код структурированный, разнесённый на многие файлы и функции?
@sysfab
@sysfab Жыл бұрын
Ну да
@zproger
@zproger Жыл бұрын
Да, но вы ведь видели сколько итераций я ставил? Если каждая ваша функция будет выполняться 100млн раз, то да, на пару секунд будет медленней) Но не стоит жертвовать читаемостью ради этих пару секунд
@Putu_pererenan
@Putu_pererenan Ай бұрын
Чувак, поздравляю, ты сэкономил 0.000001 ms, я даже не представляю что ты будешь делать с этим выигрышем производительности, половину серверов придется выбрасывать
@inferrna
@inferrna Жыл бұрын
Если всё настолько плохо, что руки тянутся писать нечитаемую кашу ради прироста скорости, возможно стоит присмотреться к другим языкам.
@zproger
@zproger Жыл бұрын
Это не нужно писать) Мы просто рассматриваем почему это быстрее с технической части
@disik603
@disik603 Жыл бұрын
Я не разбираюсь в програмировании, но чуть чуть разбираюсь в основных логических элементах и мне кажется это потому что not not- это двойное отрицание, т.е двойной лог. элемент "не". А по своей сути "не" переворачивает сигнал из за чего мы и получаем противоположный результат, но он не только его переворачивает но и усиливает, т.к "не" это усиливающий каскад, а повторяя элемент "не" мы просто переворачиваем сигнал также на 180 градусов. Если моя догадка дошкольника не верна, то извиняюсь...
@disik603
@disik603 Жыл бұрын
Ладно, ничего не понял в видео. Но извиняюсь
@user-fe1dd4bd8f
@user-fe1dd4bd8f Жыл бұрын
Не, тут так не работает. Ты что-то из электротехники рассказываешь.
@rarogcmex
@rarogcmex Жыл бұрын
Приходите к нам в плюсы! У нас такого нет, так как есть LTO!
@-wx-78-
@-wx-78- Жыл бұрын
Всеми богами клянусь: пайтоновцы знают сишную фишку !! и оптимизируют. А сравнение производительности… мля, когда бои были на ассемблере - влиял разогрев кэша всех уровней и особенности архитектуры. Срались аки львы. 😉 А по теме - bool(x) вынужденно создаёт новое значение, нот-ноту же достаточно понять falsy/truthy.
@user-up5fp8nh9g
@user-up5fp8nh9g Жыл бұрын
Так это же менее читаемо. Зачем оно? Для олимпиадников?
@zproger
@zproger Жыл бұрын
А я и не говорил что это нужно использовать, в конце видео я показал что эту конструкцию оптимизировали для повседневных задач. А в видео мы просто сравниваем скорость.
@mslq
@mslq Жыл бұрын
А можно помедленней?, я записываю.
@XpIOHdeJIb3000
@XpIOHdeJIb3000 Жыл бұрын
в питухоне даже бул работает очень медленно
@sysfab
@sysfab Жыл бұрын
пон
@lime-qh6el
@lime-qh6el Жыл бұрын
Ок
@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
@qts
@qts Жыл бұрын
Очевидную вещь растянул на 10 минут
@user-xb2dv2ew6j
@user-xb2dv2ew6j Жыл бұрын
Костыльный язык
@zproger
@zproger Жыл бұрын
Не совсем, если так глубоко копать как в видео, то тогда любой язык можно назвать костылем
@user-xb2dv2ew6j
@user-xb2dv2ew6j Жыл бұрын
@@zproger ну извините меня, такая примитивная задача как проверка на истинность, и костыль оптимизации этой задачи…
@plathardstuck28
@plathardstuck28 Жыл бұрын
Чел, спасибо, конечно, но это видео выглядит демагогией на пустом месте.
@srjsibg6osdaab946
@srjsibg6osdaab946 Жыл бұрын
:) p3d_in - как преобразовать *.bin в three.js, then *.obj (bin зашифрован?) на git: convert_me_back_0.2
ТОП 8 Редких и Удобных фишек в Python
10:57
ZProger [ IT ]
Рет қаралды 28 М.
Little girl's dream of a giant teddy bear is about to come true #shorts
00:32
Зачем он туда залез?
00:25
Vlad Samokatchik
Рет қаралды 3,3 МЛН
Mom's Unique Approach to Teaching Kids Hygiene #shorts
00:16
Fabiosa Stories
Рет қаралды 30 МЛН
РОССИЙСКИЕ LINUX: Топ 3 и кому нужны?
6:23
__new__ или __init__ в Python? Знаете ли вы это..
12:37
18 Фишек Python о которых мало кто говорит
14:13
Little girl's dream of a giant teddy bear is about to come true #shorts
00:32