Разумно ли интегрировать 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