2010-08-20 4 views
12

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

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

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

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

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

Спасибо! :)

+1

http://theunixgeek.blogspot.com/2008/09/c-vs-python-speed.html – Incognito

+1

Если вы не уверены в C, вы когда-нибудь считали, что используете достойный скомпилированный язык более высокого уровня, такой как C++ или Java вместо python. Вы знаете ... python - это не ответ на все. –

+0

Спасибо Wayne за исправление орфографии :) –

ответ

34

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

+19

+1: Сначала начните работать. Затем оптимизируйте. –

+3

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

10

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

+3

+1: Если это не связано с множеством интенсивных вычислений, то ограничивающими факторами всегда являются ресурсы ОС, такие как файловые системы и слоты процесса и память. –

+0

@ Яцек - Хорошая точка. Вы также можете написать код высокой производительности в C для частей вашего проекта, как @jshen отметил в своем ответе. – ChaosPandion

+0

"(обрабатывается встроенными функциями), тогда производительность Python обычно будет сопоставима с производительностью C" ... О, пожалуйста. Я получаю то, что вы говорите, но ... о, пожалуйста. – JustBoo

7

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

Да.

Заметные различия эти

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

  2. Код Python намного легче читать.

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

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

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

+0

2. Мнение. Некоторые люди ненавидят код на основе пробелов. 3. Ничто не связано с Python, C имеет библиотеки модульного тестирования. 4. Файлы заголовков не занимают много времени, если у вас есть хороший редактор. 5. Нет. Нет ничего проще, чем C для упаковки, потому что Makefiles очень просты. – alternative

+0

До тех пор, пока я не начал возиться с исходным кодом * Quake 3 *, я не понял, сколько церемоний связано с сложными проектами C. * (Раньше я играл только с микроконтроллерами.) * – ChaosPandion

+0

Я забыл: -1, потому что весь ответ не имеет ничего общего с производительностью. – alternative

3

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

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

Это говорит:

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

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

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

+0

Его проще найти связанный список, чем динамически выделяемый блок памяти, но следует ли использовать связанный список для поиска? – alternative

+0

@mathepic: Возможно, вы захотите использовать дерево для поиска. Или вы можете использовать хэш-карту. Я не уверен, что вы получаете с вашим комментарием. –

+0

@mathepic: как C, так и Python поддерживают связанные списки и динамически распределяемую память, не говоря уже о других методах. Поскольку вопрос запрашивает C vs Python, я тоже не понимаю цель вашего комментария. – mpez0

4

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

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

+1

+1 Умный ответ. –

+0

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

+0

+1 для противодействия глупости -1. @Longpoke Просто потому, что ввод-вывод является узким местом, это не означает, что код обработки не может быть вторым узким местом. – alternative

10

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

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

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

+0

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

1

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

3

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

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

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

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

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

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

+0

и убедитесь, что вы запустите свой код python за опытным разработчиком python.C - не единственный язык, в котором есть место для плохого программирования, чтобы резко увеличить время разработки и время работы. – aaronasterling

0

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

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

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

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

0

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

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

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

0

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

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

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

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

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

+0

-1. «ваша программа на C, как правило, просто сбой» вы можете записывать дампы памяти при сбое и позже отлаживать их. – SigTerm

1

Чтобы получить представление о разнице в скорости, проверьте Computer Languages Benchmark Game.

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

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

0

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

0

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

Смежные вопросы