Различия в производительности между Python и C

Работа с различными проектами У меня есть выбор выбора разных языков программирования, если задача выполнена.

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

Задачи, которые необходимо выполнить, довольно разнообразны, например. сортировка текстовых файлов, доступ к диску, доступ к сети, разбор текстового файла.

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

И в вашем опыте, учитывая силу текущего процессора (i7), действительно ли это заметная разница (подумайте, что это программа, которая не доводит систему до колен).

Спасибо!:)

Ответы

Ответ 1

Используйте python, пока у вас не возникнет проблема с производительностью. Если вы когда-нибудь выясните, в чем проблема (часто это не то, что вы бы догадались). Затем разрешите эту конкретную проблему производительности, которая, скорее всего, будет изменяться алгоритмом или структурой данных. В редком случае, когда ваша проблема действительно нужна C, вы можете написать только эту часть на C и использовать ее из своего кода на языке python.

Ответ 2

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

Ответ 3

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

Вы говорите, что делаете такие вещи, как обработка текстовых файлов, но то, что вы опускаете, - это объем обработки текстовых файлов, которые вы делаете. Если вы обрабатываете 10 миллионов файлов в час, вам может понадобиться написать его на C. Но если вы обрабатываете 100 файлов в час, почему бы не использовать python? Вам действительно нужно иметь возможность обрабатывать текстовый файл в 10 мс против 50 мс? Если вы планируете будущее, спросите себя: "Разве это то, что я могу просто бросить больше оборудования позже?"

Написание твердого кода на C жестко. Убедитесь, что вы можете оправдать это вложение усилий.

Ответ 4

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

Да.

Заметными отличиями являются

  • Там гораздо меньше кода Python.

  • Код Python намного проще читать.

  • Python поддерживает действительно хорошее модульное тестирование, поэтому код Python имеет более высокое качество.

  • Вы можете написать код Python быстрее, так как в нем меньше возможностей причудливого языка. Например, препроцессор действительно не экономит много взлома. Супер-опытные программисты C почти не замечают этого. Но все, что сэндвич-материал #include и правильное редактирование файлов .h замечательно занимает много времени.

  • Python может быть проще упаковать и развернуть, так как вам не нужна большая приманка make script для сборки.

Ответ 5

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

Ваш алгоритм ввода-вывода должен быть независим от вашего алгоритма вычисления. Если это так, то использование C для алгоритма вычисления может быть намного быстрее.

Ответ 6

Первое правило вопросов производительности компьютера: ваш пробег будет отличаться. Если для вас важны небольшие различия в производительности, единственным способом получения достоверной информации является тестирование с вашей конфигурацией, вашими данными и вашим эталоном. "Маленький" здесь, скажем, в два раза.

Второе правило для вопросов производительности компьютера: для большинства приложений производительность не имеет значения - самый простой способ написать приложение дает адекватную производительность, даже когда проблема масштабируется. Если это так (и это обычно так), не беспокойтесь о производительности.

Это сказало:

  • C компилируется до исполняемого файла и, следовательно, имеет потенциал для выполнения, по крайней мере, так же быстро, как и любой другой язык
  • Python обычно интерпретируется и, следовательно, может занять больше процессора, чем скомпилированный язык
  • Очень немногие приложения "связаны с процессором". I/O (на диск, дисплей или память) не сильно зависит от компилированных и интерпретируемых соображений и часто является важной частью компьютерного времени, затраченного на приложение.
  • Python работает на более высоком уровне абстракции, чем C, поэтому время разработки и отладки может быть короче

Мой совет: Развивайте язык, на котором вы найдете наиболее простой способ работы. Подготовьте свою программу, а затем проверьте ее работоспособность. Если, как обычно, производительность адекватна, все готово. Если нет, профайл вашего конкретного приложения, чтобы узнать, что занимает больше времени, чем ожидалось или допустимо. Посмотрите, можете ли и как вы можете исправить эту часть приложения, и повторите при необходимости.

Да, иногда вам может потребоваться отказаться от работы и начать работу, чтобы получить требуемую производительность. Но наличие рабочей (хотя и медленной) версии приложения будет большой помощью для достижения прогресса. Когда вы достигнете и победите эту цель, вы будете отвечать на вопросы о производительности в SO, а не спрашивать их.

Ответ 7

(Предположение. Вопрос подразумевает, что автор знаком с C, но не с Python, поэтому я буду основывать свой ответ на этом.)

Мне было интересно, что разница в терминах производительность, между написанием программы в Python, в отличие от этого в C.

C почти наверняка будет быстрее, если он не будет реализован плохо, но реальные вопросы:

  • Каковы последствия развития (время разработки, обслуживание и т.д.) для реализации?
  • Является ли значительным преимуществом производительность?

Обучение Python может занять некоторое время, но есть модули Python, которые могут значительно ускорить время разработки. Например, csv module в Python упрощает чтение и запись csv. Кроме того, строки Python, массивы, карты и другие объекты делают его более гибким, чем обычный C, и более элегантным, на мой взгляд, чем эквивалентный С++. Некоторые вещи, такие как доступ к сети, могут быть намного быстрее разработаны на Python.

Однако, может потребоваться время, чтобы узнать, как правильно программировать Python для выполнения вашей задачи. Поскольку вы заинтересованы в производительности, я предлагаю попробовать простую задачу, такую ​​как сортировка текстового файла, как в C, так и в Python. Это даст вам лучший базовый уровень на обоих языках с точки зрения производительности, времени разработки и, возможно, обслуживания.

Ответ 8

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

Ответ 9

Чтобы получить представление о необработанной разнице в скорости, ознакомьтесь с Компьютерная игра Benchmark Game.

Затем вы должны решить, имеет ли это значение для вас.

Лично я решил, что это так, но большую часть времени вместо использования C я использовал другие языки более высокого уровня. Лично я в основном использую Scala, но у Haskell и С# и Java есть свои преимущества.

Ответ 10

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

Для программ, которые я реализовал на обоих языках, используя аналогичные алгоритмы, я не видел улучшения (а иногда и ухудшения производительности) для строкового и IO-тяжелого кода при повторной реализации кода на питоне в C. Выполнение во времени доминирует распределение и манипуляция строками (функциональность python реализуется очень эффективно) и ожидание операций ввода-вывода (что накладывает одинаковые накладные расходы на любом языке), поэтому дополнительные накладные расходы на python очень мало отличаются.

Но для программ, которые выполняют даже простые операции с файлами изображений, скажем (изображения, достаточно большие для того, чтобы время обработки было заметно по сравнению с IO), C значительно быстрее. Для такого рода задач основная часть времени, использующего код python, расходуется на Python Stuff, и это затмевает время, потраченное на основные операции (умножить, добавить, сравнить и т.д.). Когда переоценивается как C, бюрократия уходит, компьютер тратит свое время на настоящую честную работу, и по этой причине дело выполняется намного быстрее.

Это не редкость для запуска кода python (скажем) 5 секунд, где код C работает (скажем) 0.05. Так что 100-кратное увеличение - но в абсолютном выражении это не такая уж большая сделка. Для написания кода на питоне требуется намного меньше времени, чем для написания кода на C, что ваша программа должна запускаться некоторое количество раз, чтобы увеличить прибыль. Я часто переопределяю на C по разным причинам, но если у вас нет этого требования, то это, вероятно, не стоит беспокоить. Вы не получите эту часть своей жизни, и в следующем году компьютеры будут быстрее.

Ответ 11

На самом деле вы можете эффективно решать большинство ваших задач с помощью python.

Вы просто должны знать, какие инструменты использовать. Для обработки текста есть блестящий пакет от парней Egenix - http://www.egenix.com/products/python/mxBase/mxTextTools/. Мне удалось создать очень эффективные синтаксические анализаторы с помощью python, так как весь тяжелый подъем выполняется с помощью собственного кода.

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

Ответ 12

Вы найдете C намного медленнее. Ваши разработчики должны будут отслеживать распределение памяти и использовать библиотеки (например, glib) для обработки простых вещей, таких как словари или списки, которые имеют встроенный python.

Кроме того, при возникновении ошибки ваша программа C обычно просто падает, что означает, что вам нужно будет получить ошибку в отладчике. Python даст вам трассировку стека (обычно).

Ваш код будет больше, что означает, что он будет содержать больше ошибок. Таким образом, не только потребуется больше времени для записи, но и отладки потребуется больше времени, и будет отправлено больше ошибок. Это означает, что клиенты чаще будут замечать ошибки.

Итак, ваши разработчики потратят больше времени на исправление старых ошибок, и поэтому новые функции будут работать медленнее.

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

Ответ 13

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

Ответ 14

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