Польза и вред кастомизации

09 ноября 2022
Польза и вред кастомизации

В Python есть кастомизация. Собственные рингтоны и заставки как владельцы первых смартфонов не установите, но возможности есть. Но стоит ли игра свеч? Об этом и не только в нашем ноябрьском дайджесте.

Custom exceptions

Задумайтесь — а нужны ли вообще пользовательские исключения? С одной стороны, в Python есть обилие встроенных исключений «‎на все случаи жизни». А с другой, хорошим вариантом будет говорить, где конкретно ошибка в приложении, а не просто указывать на большой кусок кода.

Не будем вдаваться в крайности, можно найти баланс между использованием обоих типов исключений и извлечь из этого пользу.

Создать пользовательское исключение легко — объявляем класс, являющийся наследником от встроенного Exception.

>>> class PredictionError(Exception):
...     pass

Вместо pass можно использовать эллипсис, о котором мы писали в предыдущем дайджесте или заменить полностью строкой документации. Имена исключениям важно давать максимально информативные и соблюдать нотацию CamelCase. Чем подробнее будет имя исключения, тем проще его будет воспринимать в коде.

Не забывайте, что для имён классов исключений в конце используется слово Error. Это немного смущает, ведь исключения и ошибки — две разные сущности, создаваемые с разными целями. В некоторых случаях исключение может быть тождественно ошибке. Реально же исключение стоит вызывать лишь при возникновении исключительной ситуации, она не обязательно будет ошибочной.

Пара важных моментов про вызов пользовательских исключений. Это либо делается вместе с проверкой какого-либо условия, либо перехватом встроенного исключения. Наиболее полезен второй вариант. Если включить в него сообщение, больше относящееся к конкретным особенностям приложения, то финально мы получим два блока информации. Один блок о содержимом стека, а другой с дополнительной информацией про то, что именно случилось с приложением.

Разумеется, это лишь идеи, конкретное воплощение которых раскрывает статья Should we use custom exceptions in Python?. Там есть примеры кода и детальное объяснение каждого из описываемых решений.

Собственные расширения Python

Продолжаем тему кастомизации, сейчас расскажем о расширениях.

Иногда данных значительно больше, чем можно обработать имеющимися ресурсами. С одной стороны, можно отдать это на откуп инфраструктуры, благо современные облака легко масштабируются. Но вот с другой стороны, можно попробовать ускорить работу кода за счёт написания собственных расширений на других языках, таких как Cyphon или Rust.

Почему это должно работать быстро? Python был создан на компромиссах между удобством и производительностью. Так что некоторые вещи в других языках могут работать в десятки раз быстрее. Это основная причина, по которой разработчики начинают писать собственные расширения и подключать их к Python.

Нет, не стоит прямо сейчас открывать любимую IDE и переписывать всё, что можно и нельзя. Вначале оцените, насколько оригинальный код эффективен. Возможно лезть в дебри не потребуется и вы обнаружите, что получить прирост скорости можно простой оптимизацией и последующим рефакторингом. И лишь не найдя таких вариантов, стоит обратить внимание на написание собственного расширения.

Это ведь тоже компромисс. Если делать расширение на Rust, то придётся смириться с тем, что у него более сложный синтаксис и статическая типизация. Если возьмёте Cython с привычной динамической типизацией и пропустите какой-либо тип переменной, то производительность может резко упасть, а в чём тогда смысл?

Тем не менее, когда вы точно понимаете где находится bottleneck вашего кода, усилия по написанию собственного расширения будут оправданы. Это может улучшить производительность. Напоследок советуем прочитать туториал от RealPython про создание собственных расширений на С и статью Nine Rules for Writing Python Extensions in Rust.

Распознавание речи с OpenAI Whisper

Американская компания OpenAI, одним из основателей которой является Илон Маск, в конце сентября этого года сделала важный вклад в развитие открытого программного обеспечения. они выложили в общий доступ система распознавания речи (ASR) Whisper. Сердце системы — натренированная на 680 000 часов речи нейронная сеть, которая по словам разработчиков приблизилась к человеческому уровню распознавания.

Разумеется, нейронная сеть «‎заточена» на английский язык. Но это вовсе не значит, что она бесполезна для распознавания русского языка. Некоторые исследовательские проекты уже провели эксперименты на примере видеозаписей с российского ТВ.

Эта нейронная сеть содержит 1.6 миллиарда параметров и способна выполнять перевод с 97 языков мира. Вместе с качественными и специальным образом подготовленными данными для обучения, разработчики задействовали приличное количество зашумлённых и не слишком качественных записей. В итоге это позволило существенно улучшить показатели нейросети.

Такая система отлично подойдёт для получения расшифровки подкастов, докладов и конференций. Её можно применять в качестве основы для создания новых приложений с распознаванием речи, систем «‎умный дом» и интерактивных голосовых меню (IVR).

JIT-компилятор для Numpy

В наших дайджестах мы затрагивали тему JIT-компиляторов для Python, таких как Pyjion. Сегодня расскажем ещё об одном инструменте, позволяющем значительно ускорить обработку данных библиотекой NumPy. Это JIT-компилятор Numba, разрабатываемый при поддержке гигантов Intel, AMD и NVIDIA.

Основная идея — выполнять преобразование отдельных функций, написанных на  Python, в быстрый и оптимизированный машинный код с помощью LLVM. При этом разработчику не надо особо задумываться — достаточно обернуть нужную функцию декоратором, а Numba сделает всю остальную работу.

Если же кода много и делать в этом случае ручное декорирование долго, можно воспользоваться автоматическим декоратором. Все подлежащие ускорению функции будут собраны в единый модуль и к ним будет автоматически применён jit-декоратор. Также почитайте прекрасный 5-минутный гайд, как быстро начать применять Numba в своём проекте и какие режимы работы стоит использовать. 

Если же слегка поработать над кодом, можно добиться ещё лучшей производительности за счёт использования SIMD-векторизации и многопоточности. Первое улучшает взаимодействие с железом, автоматически определяя какие расширения стандартного набора команд есть в используемом процессоре. Второе улучшает работу кода на нескольких ядрах и упрощает запись параллельных циклов.

Отдельно отметим, что Numba позволяет задействовать технологию CUDA и исполнять разогнанный код непосредственно на графических процессорах Nvidia. При правильном применении это сделает ваш Python-код потрясающе быстрым.

Интересно посмотреть

Пропустили наш предыдущий Python-митап? Не беда! Все доклады есть на нашем YouTube-канале в 4K.

Алексей Шарыпов из VK рассказал, как они писали сервис для тестирования «‎черного ящика» (приложения без тестов и документации), написанном на малоизвестном языке:

Савостьянов Дмитрий из Nordcurrent поделился опытом работы с необычным контентом, а именно записями игры в Dota 2. Как парсить реплеи матчей и записи стримов на YouTube и находить хайлайты при помощи специально обученных нейросетей BERT и TrOCR:

Денис Аникин из Райффайзенбанка разложил по полочкам мысли о том, куда движется Python. Когда и зачем он ускоряется, NoGIL, Сinder и прочих нововведениях:

Теперь следить за митапами Evrone стало удобнее. В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи после мероприятий. А ещё, у нас можно выступить, мы поможем оформить вашу экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.

Вакансии

Удаленка / Офис

Evrone 

Мы открыты для новых Python-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.