Разумно ли интегрировать Python с C для производительности? - PullRequest
3 голосов
/ 02 июня 2009

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

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

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

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

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

Ответы [ 7 ]

8 голосов
/ 02 июня 2009

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

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

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

8 голосов
/ 02 июня 2009

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

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

7 голосов
/ 02 июня 2009

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

4 голосов
/ 03 июня 2009

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

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

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

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

import psyco
psyco.bind(myfunction)

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

3 голосов
/ 02 июня 2009

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

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

2 голосов
/ 02 июня 2009

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

1 голос
/ 02 июня 2009

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

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