Учебники по оптимизации нетривиальных приложений Python с расширениями C или Cython - PullRequest
25 голосов
/ 16 ноября 2010

Сообщество Python опубликовало полезный справочный материал, показывающий, как профилировать код Python, и технические подробности расширений Python в C или в Cython . Я все еще ищу учебники, которые показывают, однако, для нетривиальных программ Python, следующее:

  1. Как определить точки доступа, которые выиграют от оптимизации путем преобразования в расширение C
  2. Не менее важно, как определить точки доступа, которые не выиграют от преобразования в расширение C
  3. Наконец, как сделать соответствующее преобразование из Python в C, используя Python C-API или (возможно, даже предпочтительно), используя Cython.

Хороший учебник предоставит читателю методологию того, как рассуждать с помощью проблемы оптимизации, работая с полным примером. Мне не удалось найти такой ресурс.

Вам известен (или вы написали) такой учебник?

Для пояснения, меня не интересуют учебники, которые охватывают только следующее:

  • Использование профиля (c) для профилирования кода Python для измерения времени работы
  • Использование инструментов для проверки профилей (я рекомендую RunSnakeRun )
  • Оптимизация путем выбора более подходящих алгоритмов или конструкций Python (например, наборы для проверки членства вместо списков); учебник должен предполагать, что алгоритм и код Python уже оптимальны, и мы находимся в точке, где расширение C является следующим логическим шагом
  • Пересчет документации Python по написанию расширений C , который уже превосходен в качестве справочного материала, но не полезен в качестве ресурса, показывающего, когда и как перейти с Python на C.

Ответы [ 4 ]

9 голосов
/ 16 ноября 2010

Точки 1 и 2 являются просто основным правилом оптимизации.Я был бы очень удивлен, если бы было какое-то учебное пособие, которое вы ищете.Может быть, поэтому вы не нашли ни одного.Мой короткий список:

  • правило номер один оптимизации: не .
  • правило номер два мера
  • правило номер три определяет ограничивающий фактор (если он связан с вводом-выводом или базой данных, оптимизация все равно не может быть достигнута).
  • правило номер четыре - думаю , используйте более совершенные алгоритмы и структуру данных ...
  • , учитывая, что смена языка довольно мала в списке ...

Просто начните с профилирования своего кода на Python с помощью обычные инструменты Python .Найдите, где ваш код должен быть оптимизирован.Затем попробуйте оптимизировать его с помощью Python.Если это все еще слишком медленно, попытайтесь понять, почему.Если это связано с IO, вряд ли C-программа будет лучше.Если проблема возникла из-за алгоритма, маловероятно, что C будет работать лучше.На самом деле «хорошие» случаи, когда C может помочь, довольно редки, время выполнения не должно быть слишком далеко от того, что вы хотите (например, в 2–3 раза), структура данных проста и выиграет от представления низкого уровня, и вы действительно,действительно нужно это ускорение.В большинстве других случаев использование C вместо Python будет неудобной работой.

Действительно, довольно редко вызов кода на C из python делается с учетом производительности в качестве основной цели.Чаще всего цель состоит в том, чтобы связать python с некоторым существующим кодом C.

И, как сказал другой автор, вам, вероятно, лучше посоветовать использовать cython.

Если вы все еще хотите написатьМодуль C для Python, все необходимое находится в официальной документации .

6 голосов
/ 16 ноября 2010

У О'Рейли есть учебное пособие (насколько я могу свободно сказать, я смог прочитать все), которое иллюстрирует, как профилировать реальный проект (они используют проект парсинга EDI какпредмет для профилирования) и определить горячие точки.В написании расширения C, которое устранит узкое место в статье О'Рейли, не так много подробностей.Однако он охватывает первые две вещи, которые вам нужны, с нетривиальным примером.

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

Надеюсь, это поможет.

4 голосов
/ 16 ноября 2010

Для точек 1 и 2 я бы использовал профилировщик Python, например cProfile .Смотрите здесь для быстрого обучения.

Если у вас уже есть программа на Python, для пункта 3 вы можете рассмотреть возможность использования Cython .Конечно, вместо того, чтобы переписывать на C, вы можете придумать алгоритмическое улучшение, которое увеличит скорость выполнения.

2 голосов
/ 16 ноября 2010

Я попытаюсь обратиться к вашим пунктам 1 и 2 и вашим первым 3 пунктам, но не по порядку.

Третий пункт говорит: «Предположим, алгоритм и код Python уже оптимальны».Когда код находится в этом состоянии, если брать образцы стека (, как указано здесь ), образцы показывают точно, что делает программа, с точки зрения времени, и, кажется, нет ничего, что можно было бы улучшить безизменение языка.Однако, поскольку вы знаете, как он тратит свое время, вы знаете, какой алгоритм низкого уровня (который может состоять из более чем одной функции, а не просто горячей точки) мог бы выиграть, если его заставили занимать меньше времени, то есть преобразовать в C.

Что касается пункта 1, этот метод показывает, какие части кода получат выгоду от преобразования в C, и они могут быть или не быть горячими точками.(Первое, что приходит на ум, - это какая-либо рекурсивная функция или набор функций. Или небольшая группа функций, которые вместе выполняют какую-то задачу, например, альпинист.)

Относительно пункта 2,любой код, который не отображается в исправном проценте выборок из стека или который явно не принесет пользы при преобразовании в C, такой как ввод-вывод.

Что касается первого и второго пунктов маркера, я быСогласитесь, что измерение - это не основная цель, а побочный продукт процесса поиска кода для оптимизации.Представление таких измерений также не относится к делу.

Я был в подобных ситуациях, за исключением не между python и C, но между C и аппаратными средствами. **

Просто для примера, еслиобщее время выполнения составляет 10 секунд, а алгоритм находится в стеке примерно 50% времени, тогда он отвечает примерно за 5 из 10 секунд.Если преобразование алгоритма в C даст 10-кратное ускорение, то эти 5 секунд сократятся до 0,5 секунд, поэтому общее время сократится до 5,5 секунд.(Грубо говоря, более важно добиться сокращения времени, чем точно знать заранее, насколько он будет большим.) Обратите внимание, что в этот момент весь процесс может быть повторен, и может иметь смысл преобразовать что-то еще в C.Вы можете остановить этот процесс, когда примеры показывают, что код Python делает то, что хорошо, а код C делает то, что хорошо.

** Например, математика с плавающей точкой, библиотека против чипа илиграфика, рисование текста и полигонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...