Разумно ли интегрировать Python с C для производительности?

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

Но, как я начал читать руководство по интеграции Python. В статье автор говорит:

Есть несколько причин, по которым можно расширить Python на C или C++, например:

  • Вызов функций в существующей библиотеке.
  • Добавление нового встроенного типа в Python
  • Оптимизация внутренних циклов в коде
  • Предоставление библиотеки классов C++ для Python
  • Встраивание Python в приложение C/C++

Ничего о производительности. Поэтому я снова спрашиваю: разумно ли интегрировать python с c для повышения производительности?

7 ответов

Решение

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

Когда все работает, насколько вам известно, я бы подумал об использовании оптимизатора, такого как Psyco. Я испытал буквально 10-кратное улучшение производительности, просто используя Psyco и добавив одну строчку в свою программу.

Если ничего не помогает, используйте C в нужных местах, и вы получите то, что хотите.

* Оптимизация внутренних циклов в коде

Разве это не о производительности?

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

С API расширений C общеизвестно сложно работать, но есть ряд других способов интеграции кода C.

Для некоторых более полезных альтернатив см. http://www.scipy.org/PerformancePython, в частности, раздел об использовании Weave для легкой вставки кода C.

Также представляет интерес Cython, который предоставляет хорошую систему для интеграции с кодом C. Cython используется для оптимизации некоторыми уважаемыми высокопроизводительными проектами Python, такими как NumPy и Sage.

Как упомянуто выше, Psyco - еще один привлекательный вариант для оптимизации, который не требует ничего, кроме

import psyco
psyco.bind(myfunction)

Psyco определит ваши внутренние циклы и автоматически заменит оптимизированные версии процедур.

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

Я считаю, что Mercurial проделал хорошую работу с интеграцией, если вы хотите посмотреть на их код в качестве примера. Интенсивные вычисления выполняются на C, а все остальное - на python.

Вы получите значительное повышение производительности, используя C из Python (при условии, что ваш код хорошо написан и т. Д.), Потому что Python интерпретируется во время выполнения, тогда как C компилируется заранее. Это немного ускорит процесс, потому что с C ваш код просто выполняется, тогда как с Python интерпретатор Python должен выяснить, что вы делаете, и интерпретировать его в машинных инструкциях.

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

Другие вопросы по тегам