Подтвердить что ты не робот

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Что касается пункта 2, любой код, который не отображается в здоровом проценте выборок стека, или который, но явно, не будет полезен, будучи преобразованным в C, например, I/O.

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

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

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

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