🔢 Как 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. |
На этом все, до встречи через неделю! |
|
|
Вы получили это письмо, потому что подписались на нашу рассылку. Если вы больше не хотите получать наши письма, нажмите здесь.
|
|
|
|