🔢 Как Python сравнивает целые и вещественные числа
   |  
 При сравнении int и float в Python иногда можно получить неожиданные результаты:  |  
   Это связано с: - Представлением конкретных чисел в памяти.
 - Деталями алгоритма сравнения целых и вещественных чисел, реализованного в CPython.
 
 Представление чисел в памяти -   В формате IEEE-754 с двойной точностью, используемом для хранения чисел с плавающей запятой, есть ограничение на количество бит, выделенных для представления мантиссы (52 бита). Это означает, что некоторые числа не могут быть представлены точно. В случае с числами 9007199254740992.0 и 9007199254740993.0 происходит именно эта ситуация – оба числа имеют одинаковое бинарное представление в формате IEEE-754, так как в случае 9007199254740993.0 младший значащий бит мантиссы теряется при нормализации. В итоге, внутри Python оба числа представлены как 9007199254740992.0.  
 - И напротив, число 9007199254740994.0 может быть точно представлено в формате IEEE-754, так как младший значащий бит мантиссы не теряется.
 
 Алгоритм сравнения CPython   При сравнении Python использует специальный алгоритм, который пытается избежать непосредственного сравнения битовых представлений целых и вещественных чисел. Вместо этого алгоритм анализирует знаки, экспоненты в нормализованном представлении и только в конце, если другие случаи не подходят, сравнивает целочисленные части.   С учетом особенностей представления и сравнения получаем: -   9007199254740992 == 9007199254740992.0 дает True, так как внутренние целочисленные представления равны.
 - 9007199254740993 == 9007199254740993.0 дает False, поскольку в соответствии с IEEE-754 9007199254740993.0 представлено в памяти как 9007199254740992.0, и CPython, по сути, сравнивает 9007199254740993 и 9007199254740992.0.
 - 9007199254740994 == 9007199254740994.0 дает True, потому что оба числа точно представлены и имеют равные целочисленные части.
 
   Подробный разбор особенностей представления и сравнения чисел – в этой статье.  |  
   orjson работает быстрее и обращается с JSON данными корректнее, чем стандартная библиотека (и большинство сторонних).     Производительность - Бибиотека частично написана на Rust, оптимизирована для максимальной производительности при сериализации/десериализации JSON.
 -   Использует оптимизированные алгоритмы и инструкции процессора для работы с числами с плавающей запятой и целыми числами.
 - Эффективно использует память, применяя разделяемые строки-ключи в объектах JSON.                   
 
   Нативная поддержка типов данных - Сериализует dataclass в 40-50 раз быстрее, чем другие библиотеки, упаковывая их прямо в объекты JSON
 -   Нативно работает с numpy.ndarray – в 4-12 раз быстрее других библиотек и с меньшим использованием памяти.
 - Поддерживает удобные форматы для datetime, UUID, включая RFC 3339.
 - Строгое соответствие стандарту JSON.
 -   Отклоняет некорректные строки UTF-8 при сериализации/десериализации.
 - Не принимает специальные числовые значения Nan, Inf, -Inf.
 - Предоставляет возможность строго ограничить диапазон целых чисел до 53 бит.
 
 Дополнительные возможности - Добавление перевода строки в конец сериализованной строки.
 -   Отображение времени в формате UTC как "Z" вместо "+00:00".
 - Опция для пропуска микросекунд в datetime объектах.
 - Возможность сортировать ключи в объектах по алфавиту.
 - Произвольные объекты можно сериализовать, указав пользовательскую функцию.
    Портируемость - Работает на Linux (amd64, aarch64, ppc64le, s390x), macOS (amd64, aarch64) и Windows (amd64, x86).
 -   Не имеет зависимостей, кроме libc.
 - Исходный код содержит все зависимости внутри для сборки без подключения к сети.
 
  |  
   Диапазон целочисленных значений можно ограничить с 64 до 53 бит для совместимости с браузерами  |  
 🎨 Blender в Jupyter Notebook
   |  
   ipyblender_experimental позволяет использовать рендеринговый движок Blender в блокнотах Jupyter Notebook. Пока что инструмент совместим только с Python 3.10. Видеоклипы с примерами можно посмотреть в этих твитах – первый, второй.    |  
 Так выглядят визуализации Blender в блокнотах    |  
 Шаблон Tapyr упрощает процесс создания и развертывания корпоративных панелей данных (дашбордов) на базе PyShiny:   - Обеспечивает оптимальную структуру кода.
 - Предоставляет средства для управления зависимостями, тестирования, контейнеризации и непрерывной интеграции.
 - Предусматривает возможность быстрого деплоя на платформе Posit Connect.
   
  |  
   Resume Builder – генератор резюме: содержимое редактируется в файле resume.py, а скрипт resume_builder.py рендерит информацию в виде HTML-страницы. Эту страницу можно конвертировать в PDF (с помощью «Печать в PDF») в браузере. Готовое резюме содержит всю необходимую информацию об опыте работе, навыках и контактах, и занимает одну страницу:    |  
 Метапоисковик не индексирует веб-страницы напрямую, а агрегирует и объединяет результаты из нескольких других поисковых систем и дополнительных источников. Преимущества метапоисковиков: - Более широкий охват – одновременно ищут по многим обычным поисковикам, давая более полные результаты.
 -   Конфиденциальность – не отслеживают данные о пользователях, не собирают историю поиска и не создают пользовательские профили, как это делают многие крупные поисковые системы.
 - Разнообразие источников – можно искать не только по основным поисковикам, но и по специализированным базам данных, каталогам и т.д.
 -   Удобство – один поисковый запрос сразу же получает результаты из многих разных мест.
 
   Один из таких метапоисковиков – опенсорсный SearXNG, написанный на Python. SearXNG ведет поиск по 70 различным поисковикам, не отслеживает пользователей и не хранит их данные, и может использоваться с Tor.  |  
   🏝️ Фреймворк для фулстек-разработки на Python
   |  
   Rio – новый фреймворк, который позволяет разрабатывать веб-приложения полностью на Python, без необходимости использовать HTML, CSS или JavaScript. Вот его основные преимущества: - Отсутствие разделения на фронтенд и бэкенд – Rio прозрачно обрабатывает всю коммуникацию между клиентом и сервером, скрывая детали работы с HTTP-запросами.
 -   Декларативный интерфейс. Интерфейсы в Rio строятся из повторно используемых компонентов (по примеру React, Flutter и Vue.js). Результат – модульный интерфейс, который легко расширять и поддерживать.
 - Более 50 встроенных UI-компонентов на основе Material Design от Google.
 -   Использование всех современных возможностей Python – аннотаций типов, асинхронного программирования и т.д.
 - Совместимость с отладчиком Python – к любому запущенному процессу можно подключиться отладчиком для отслеживания ошибок.
 -   Универсальность – с помощью фреймворка можно сделать сайт любой сложности, дашборд для анализа и визуализации данных, интерфейс для стороннего API.
 
  |  
   И напоследок – туториал по Streamlit для дата-сайентистов. Автор показывает, как создать и опубликовать простое приложение, и сравнивает Streamlit с двумя другими популярными инструментами, которые чаще всего используются при создании DS/ML приложений – Dash и Taipy.   |  
 На этом все, до встречи через неделю!  |  
  |  
  |  
 Вы получили это письмо, потому что подписались на нашу рассылку. Если вы больше не хотите получать наши письма, нажмите здесь.   
   |  
  |  
  |  
  |