Реализация функции в Python против C

1

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

  • 1
    А что? Для начала, вы (как правило) не компилируете Python и вам все равно нужна оболочка для вызова функций C из Python или наоборот. Для немного продвинутых пользователей, понимаете ли вы, что производительность сильно зависит от алгоритма, а затем от реализации (как кода, так и реализации языка), а не только от одного языка? (Вы можете использовать LLVM / Clang для интерпретации C и C ++ ... и несколько проектов, чтобы значительно ускорить код Python путем компиляции). Не говоря уже о том, что многие не смогут получить рабочую версию C в течение приемлемого времени.
Теги:
compilation

4 ответа

5
Лучший ответ

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

  • 3
    Чтобы быть педантичным, Python может быть скомпилирован - JIT-компиляция в Jython, IronPython и PyPy (и Psyco на x86), AOT-компиляция в Cython (хорошо, строго говоря, на другом языке) и для некоторого кода через различные проекты на разных этапах завершение (например, Щедскин.
  • 0
    @delnan: Спасибо за указание на это.
Показать ещё 3 комментария
1

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

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

  • 0
    Однородные массивы на самом деле являются плохим примером стоимости динамического поиска членов, поскольку совершенно не связаны между собой. Стоимость происходит из-за косвенного обращения, которое необходимо, потому что элементы могут быть разных размеров (обычно, для взаимодействия C-кода с Python необходимо использовать указатели на структуры PyObject ). Впрочем, за Cython.
  • 0
    @delnan: Пример с массивами был задуман в отличие от собственных списков Питонов, и там скорость огромна. Главное - использовать статическую типизацию. Кстати, я на самом деле узнал о Cython из ответа, который вы дали на мой вопрос :).
1

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню