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

Модуль a.py:

import b
print("This is from module a")

Модуль b.py

import a
print("This is from module b")

Запустит «Модуль a»:

>>> 
'This is from module a'
'This is from module b'
'This is from module a'
>>> 

Он выводит эти 3 строки, пока он должен выводить бесконечность из-за циклического импорта. Что происходит строка за строкой при запуске «Module a»:

  1. Первая строка - import b. поэтому он посетит модуль b
  2. . Первая строка в модуле b - import a. поэтому он будет посещать модуль a
  3. . Первая строка в модуле a - import b, но отмечает, что эта строка больше не будет выполняться больше , поскольку каждый файл на python выполняет импортировать строку только один раз, не имеет значения, где и когда он выполняется. поэтому он перейдет к следующей строке и напечатает "This is from module a".
  4. После завершения посещения всего модуля a из модуля b мы все еще находимся в модуле b. поэтому следующая строка будет печатать "This is from module b"
  5. . Строки модуля b выполняются полностью. поэтому мы вернемся к модулю a, где мы запустили модуль b.
  6. строка импорта b была уже выполнена и больше не будет выполнена. следующая строка будет печатать "This is from module a", и программа будет закончена.
13
задан Wayne Werner 20 August 2010 в 18:40
поделиться

13 ответов

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

37
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

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

0
ответ дан 1 December 2019 в 17:14
поделиться

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

10
ответ дан 1 December 2019 в 17:14
поделиться

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

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

При этом:

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

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

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

4
ответ дан 1 December 2019 в 17:14
поделиться

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

1
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

1
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

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

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

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

3
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

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

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

-1
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

11
ответ дан 1 December 2019 в 17:14
поделиться

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

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

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

0
ответ дан 1 December 2019 в 17:14
поделиться

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

Да.

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

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

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

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

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

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

7
ответ дан 1 December 2019 в 17:14
поделиться

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

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

4
ответ дан 1 December 2019 в 17:14
поделиться

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

-1
ответ дан 1 December 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: