Есть ли разница (с точки зрения времени выполнения) между реализацией функции в Python и ее внедрением в C, а затем ее вызовом из Python? Если да, то почему?
Python (по крайней мере, "стандартная" реализация CPython) никогда не компилируется на собственный машинный код; он компилируется в байт-код, который затем интерпретируется. Таким образом, функция C, которая на самом деле скомпилирована в машинный код, будет работать быстрее; вопрос в том, будет ли это иметь значение. Итак, какова фактическая проблема, которую вы пытаетесь решить?
Версия C часто бывает быстрее, но не всегда. Одним из основных моментов ускорения является то, что C-код не должен динамически искать значения, например Python (Python имеет ссылочную семантику). Хорошим примером для этого является Numpy. Набираются массивы Numpy, все значения в массиве имеют один и тот же тип и внутренне хранятся в непрерывном блоке памяти. Это основная причина того, что numpy намного быстрее, потому что он пропускает все динамические переменные, которые должен выполнять Python. Наиболее эффективная реализация алгоритма C может стать очень медленной, если она работает с структурами данных Python, где каждое значение нужно искать динамически.
Хороший способ реализовать такие вещи самостоятельно и сохранить все сложности C-API Python - использовать Cython.
PyObject
). Впрочем, за Cython.
Если я правильно понял и повторил ваш вопрос, вы спрашиваете, может ли процесс python поверх исполняемого файла c быть быстрее, чем сам чистый модуль python? Ответ на это - это зависит от исполняемого файла и того, какую задачу вы выполняете.
Как правило, функция, написанная на C, будет значительно быстрее, чем эквивалент Python. Его также гораздо сложнее интегрировать, поскольку он включает в себя:
Вы хотели бы быть очень уверены в том, что преимущества перевешивают затраты, прежде чем пытаться это сделать, а это означает, что это должно быть зарезервировано только для критически важных разделов вашего кода, которые вы просто не можете сделать достаточно быстро с помощью чистого Python.
Если вам действительно нужно идти по этому пути, Boost.Python может сделать задачу гораздо менее болезненной.