Реализация функции в Python против C - PullRequest
1 голос
/ 11 февраля 2011

Есть ли разница (с точки зрения времени выполнения) между реализацией функции в Python и реализацией ее в C, а затем вызовом ее из Python? Если так, то почему?

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

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

1 голос
/ 11 февраля 2011

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

Хороший способ реализовать такие вещи самостоятельно и сохранить все хлопоты Python C-API - это использовать Cython .

1 голос
/ 11 февраля 2011

Если я правильно понимаю и повторяю ваш вопрос, вы спрашиваете, будет ли перенос Python поверх исполняемого файла ac в любом случае быстрее, чем сам модуль Python?Ответ на этот вопрос зависит от исполняемого файла и типа выполняемой задачи.

  1. В Python есть набор модулей, написанных с использованием Python C-API.Производительность этих программ была бы сопоставима с переносом исполняемого файла на C
  2. С другой стороны, перенос программы c будет быстрее, чем на чистом python, реализующем те же функции с разумной логикой.Сравните использование difflib с обработкой обтекания над diff.
0 голосов
/ 11 февраля 2011

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

  1. компиляция кода C, который # включает заголовки Python и предоставляет соответствующий код-обертку, чтобы его можно было вызывать из Python;
  2. ссылки на правильные библиотеки Python;
  3. развертывание получившейся общей библиотеки в соответствующем месте, чтобы ваш код Python мог ее импортировать.

Вы хотели бы быть очень уверены, что преимущества перевешивают затраты, прежде чем пытаться сделать это, а это означает, что это должно быть зарезервировано только для критичных для производительности разделов вашего кода, которые вы просто не можете сделать достаточно быстро с чистым Python. *

Если вам действительно нужно пойти по этому пути, Boost.Python может сделать задачу намного менее болезненной.

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