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

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

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

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

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

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

Спасибо!:)

14 ответов

Решение

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

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

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

Написание твердого кода на C сложно. Будьте уверены, что вы можете оправдать эти инвестиции в усилиях.

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

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

Да.

Заметные различия заключаются в следующем

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

  2. Код Python намного проще для чтения.

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

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

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

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

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

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

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

Это говорит:

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

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

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

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

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

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

  • Каковы последствия разработки (время разработки, сопровождение и т. Д.) Для любой реализации?
  • Значителен ли выигрыш в производительности?

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

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

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

Чтобы понять разницу в скорости, посмотрите игру "Тестирование компьютерных языков".

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

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

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

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

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

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

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

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

Нередко код Python запускается, скажем, за 5 секунд, а код C работает, скажем, за 0,05. Так что это увеличение в 100 раз - но в абсолютном выражении это не так уж важно. Написание кода на Python занимает гораздо меньше времени, чем на написание кода на C, так что вашу программу придется запускать огромное количество раз, чтобы получить временную прибыль. Я часто переопределяю C, по разным причинам, но если у вас нет этого требования, то, вероятно, не стоит беспокоиться. Вы не вернете эту часть своей жизни, и в следующем году компьютеры будут работать быстрее.

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

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

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

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

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

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

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

Другие вопросы по тегам