Как ускорить Python с помощью C ? | OTUS

Курсы

Программирование
iOS Developer. Basic
-23%
Python Developer. Professional
-13%
Golang Developer. Professional
-17%
Python Developer. Basic
-16%
iOS Developer. Professional
-13%
C# ASP.NET Core разработчик
-18%
Unity Game Developer. Professional
-11%
React.js Developer
-12%
Android Developer. Professional
-7%
Software Architect
-12%
C++ Developer. Professional
-8%
Разработчик C#
-8%
Backend-разработчик на PHP
-8%
Архитектура и шаблоны проектирования
-12%
Программист С Разработчик на Spring Framework MS SQL Server Developer AWS для разработчиков Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Vue.js разработчик VOIP инженер Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер-практикум по использованию и настройке GIT IoT-разработчик Advanced Fullstack JavaScript developer Супер-интенсив Azure
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-17%
DevOps практики и инструменты
-18%
Архитектор сетей
-21%
Инфраструктурная платформа на основе Kubernetes
-22%
Супер-интенсив «IaC Ansible»
-16%
Супер-интенсив по управлению миграциями (DBVC)
-16%
Administrator Linux. Professional
-5%
Administrator Linux.Basic
-10%
Супер-интенсив «ELK»
-10%
Базы данных Сетевой инженер AWS для разработчиков Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Как ускорить Python с помощью C ?

Python_Deep_21-5020-d5ad86.09_site.png

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

Кстати говоря, эта необходимость не всегда бывает вызвана проблемами с производительностью. Иногда просто нужно вызывать какой-нибудь C-функционал из Python, чтобы, например, протестировать его. Есть разные варианты скрещивания Python и С в зависимости от навыков и потребностей.

Рассмотрим три способа

  • Непосредственно писать на С, связываясь с Python через C API, который предоставляет CPython. Это путь для тех, кто неплохо владеет С и хочет иметь практически полный контроль над тем, что происходит. Но это возлагает на программиста ответственность за компиляцию, портируемость кода и даже за reference management объектов интерпретатора.
  • Писать код, который транслируется в C. Обычно в данном случае подразумевает использование Cython. Любой Python-код = уже валидный Cython-код! Cython сгенерит (особенно с помощью аннотаций, за написание которых уже отвечает программист) С-код, по возможности применив различные оптимизации и обеспечив портируемость. Минусы тут следуют из плюсов: опять нужно компилировать, нужно учить новый синтаксис и инструменты. Есть еще SWIG, но он скорее полезен для тех случаев, когда есть необходимость сделать много binding’ов к одному С-коду.
  • Писать код, который вызывает С-функции из разделяемых библиотек (shared libraries). Здесь многое зависит от того, насколько «развесистый» интерфейс необходимо вызывать. Для небольших вполне подходит ctypes – встроенного в CPython механизма. Проблема лишь в том, что описание вызываемых функций, передаваемых типов, кастинг и пр. – всё это крайне подвержено ошибкам. Да и читается это тяжело. Поэтому для сложных интерфейсов лучше подойдет cffi от создателей Pypy. Этой библиотеке не нужно всё объяснять, она сама многое выяснит, взглянув на .h-файл. Оба инструмента работают за счёт libffi, которая позволяет получить знание «как вызвать С-функцию», грубо говоря, объединив символы из разделяемой библиотеки и описание из .h-файла.

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться