Является ли Python медленнее, чем Java/C#? [закрытый]



является ли Python медленнее, чем Java/C#?



производительность-сравнение-c-java-python-ruby-jython-jruby-groovy



вот проект, который оптимизирует CPython:без груза-глотать

765   13  

13 ответов:

не объединяйте язык и время выполнения.

Python (язык) имеет множество реализаций во время выполнения.

  • с CPython является, как правило, интерпретируется, и будет медленнее, чем в нативном коде на C#. Это может быть медленнее, чем Java, в зависимости от компилятора Java JIT.

  • JYthon интерпретируется в JVM и имеет тот же профиль производительности, что и Java.

  • установить IronPython опирается на то же самое .Net библиотек и Ил как C#, таким образом, разница в производительности будет относительно небольшой.

  • Python может быть переведен в машинный код через PyREX, PyToC и другие. В этом случае он, как правило, будет работать так же, как и C++. Вы можете-в некоторой степени-дополнительно оптимизировать C++ и, возможно, выжать немного лучшую производительность, чем неоптимизированный вывод из PyREX.

    для получения дополнительной информации см. http://arcriley.blogspot.com/2009/03/so-long-pyrex.html

обратите внимание, что Python (язык) не медленно. Некоторые времена выполнения Python (например, CPython) будут медленнее, чем собственный код C++.

не совсем правильно спрашивать, почему Python медленнее, чем Java/C#. Как быстро это Java? Ну, наивные интерпретаторы примерно в десять раз медленнее, чем оптимизированные компиляторы. Я считаю, что есть интерпретатор Java bytcode, написанный на JavaScript-это, вероятно, не очень быстро. Итак, предполагаемый вопрос, по-видимому, звучит так: "почему языковая система CPython медленнее, чем эквивалентная Sun, IBM и Oracle JRE и Microsoft .NET runtime?"

Я считаю, что правильный ответ не является техническим. Этот самые быстрые Java и .NET runtime быстрее, потому что у них есть большие штатные технические команды, разрабатывающие их в конкурентной среде производительности.

динамические языковые системы просты в реализации. Любой идиот может это сделать. У меня есть. Статические языковые системы более сложны в проектировании и реализации. Простая статическая система будет работать намного быстрее, чем эквивалентный просто работающий динамический эквивалент. Однако высокооптимизированные динамические системы могут работать почти так же быстро. Я поймите, некоторые реализации Smalltalk были довольно хороши. Часто цитируемым примером развитой динамической системы является MIT Lisp Machine.

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

Как уже упоминалось в других ответах, это зависит от системы времени выполнения, а также от поставленной задачи. Таким образом, стандартный (C)Python не обязательно медленнее, чем Java или C#. Некоторые из его модулей реализованы в C. Таким образом, сочетая скорость a уроженца реализация с языком Python.

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

testee. language arbitrary-precision integers run-time

     1. Java     java.math.BigInteger         JRE 6.13
     2. .NET     System.Numerics.BigInteger   MS CLR 4.0
     3. Python   long                         Active Python 2.6.2.2
     4. Squeak   BigInt                       Squeak 3.10.2
     5. .NET     Mono.Math.BigInteger         MS CLR 4.0

results:

                 1)         2)       3)       4)        5)
   10.000!      343 ms    137 ms    91 ms  1.200 ms    169 ms
   20.000!    1.480 ms    569 ms   372 ms  1.457 ms    701 ms
   30.000!    3.424 ms  1.243 ms   836 ms  3.360 ms  1.675 ms
   40.000!    6.340 ms  2.101 ms 1.975 ms  6.738 ms  3.042 ms
   50.000!   10.493 ms  3.763 ms 3.658 ms 10.019 ms  5.242 ms
   60.000!   15.586 ms  7.683 ms 5.788 ms 14.241 ms 10.000 ms

alt текст http://www.mycsharp.de/wbb2/attachment.php?attachmentid=6909&sid=0d5aa62b522d005d9e7089785b5d19f1

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

кроме того, "целые числа произвольной точности" Python-это встроенный long. Следовательно, вам даже не нужна специальная обработка типов, которая требуется для класса BigInteger Java.

просто Python медленно.

независимо от того, какой интерпретатор (в настоящее время доступный) вы используете, он медленнее, чем Java и C. В различных тестах он медленнее, чем Ruby и PHP. Не зависите от чужих ответов, проверяйте и проверяйте сами.

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=python3&lang2=java&data=u64q

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

отказ от ответственности - этот ответ, вероятно, повредит любителям питона. Я тоже Разработчик Python, любит разрабатывать веб-приложения в Django/Flask / Pyramid, а не Spring (Java). Но я вижу практически в своей работе и опыт, как Python медленнее. Скорость не всегда является моим приоритетом. Но я стою с ними, кто говорит, что интерпретатор Python должен получить смазку и смазку или полное изменение двигателя, чтобы по крайней мере стоять в марафоне. Это основной язык программирования.

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

тем не менее, я бы предположил, что статическая и динамическая природа вполне может иметь с этим много общего. Для невиртуальных вызовов JIT-скомпилированный C# / Java чрезвычайно дешев, поскольку его можно точно определить в JIT-time. Даже виртуальные вызовы просто включают в себя один уровень перенаправления. Когда привязка становится динамической, есть более широкий спектр вещей, чтобы рассмотреть.

Я не знаю достаточно подробностей о Python, чтобы утверждать, что понимаю его точное поведение во время выполнения, которое, как я подозреваю, может варьироваться в зависимости от версии и реализации. Существует такая вещь, как" байтовый код python", который затем выполняется виртуальной машиной - независимо от того, действительно ли эта виртуальная машина выполняет JIT-компиляцию или нет, это другое дело.

Это сводится к тому, что фаза компиляции имеет меньшую информацию для работы и, следовательно, среда выполнения должна выполнять больше работы в случае Duck typed (динамически типизированных) языков.

таким образом, если я делаю вызов метода Foo.bar (), в случае Java или C++ вызов bar может быть оптимизирован в процессе компиляции, обнаружив тип "foo", а затем непосредственно вызывая метод в том месте памяти, где компилятор знает, что он будет найден. С компилятор python или любого другого динамически типизированного языка не знает, к какому типу принадлежит объект foo, он должен выполнить проверку типа во время выполнения, а затем найти адрес метода bar и затем вызвать его.

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

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

то, что вы там получили, является наглядным примером написания Java в Python:

 def __init__(self,size):  
     self.first = None  
     last = None  
     for i in range(size):  
         current = Person(i)  
         if self.first == None : self.first = current  
         if last != None :  
             last.next = current  
             current.prev = last  
         last = current  
     self.first.prev = last  
     last.next = self.first  

немного более подходящие для Python:

 def __init__(self,size):  
     chain = [Person(i) for i in range(size)]
     self.first = chain[0]
     chain = zip(chain, chain[1:].append(chain[0]))
     for p,n in chain:
        p.next = n
        n.prev = p

Я думаю, что в конечном итоге Python не идет так далеко, как может с оптимизацией. Большинство методов оптимизации, которые являются общими для статических языков. Там are методы оптимизации для динамических языков, но современные не используют их как могли. Стив Егге имеет отличный сообщение в блоге на эту тему.

EDIT: Я просто хотел сказать, что я не должен об этом чтобы быть критичным к Python. Я предпочитаю простоту над ненужной скоростью в любой день.

Это не имеет ничего общего с самими языками, это просто тот факт, что java реализация и системы (JVM) очень высокомарочны, и что серии ресурсов были проинвестированы в стабилности, масштабируемости и улучшениях представления над летами.

сравните это с тем, что реализация CPython совсем недавно реализовала EG threaded dispatch в своем интерпретаторе, что дало ему повышение производительности до 20% для конкретные проблемы. Это не хорошо, как это звучит, это плохо, потому что такая базовая оптимизация должна быть там с первого дня.

на этот тип вопроса нельзя ответить только качественными рассуждениями, вам нужны хорошие тесты для его резервного копирования. Вот один набор, который сравнивает Python 3 vs C# Mono и найти Python, чтобы быть от 3 до 300 раз медленнее. Результаты Python и Java аналогичны. (Применяются обычные предостережения относительно интерпретации контрольных показателей.)

эти тесты также сообщают размер исходного кода, и Python был значительно более кратким, чем Java и C#.

Я думаю наоборот. Я могу сделать простую программу на Python быстрее, чем на Java, и эти скрипты Python работают очень быстро.

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

Я бы сказал, что простота и простота написания кода Python позволяет писать более сложный код; например, код, который использует преимущества многоядерных процессоров. Поскольку производительность каждого ядра была в основном застойной в течение последних 5-10 лет, я не думаю, что ясно, что программы Python (независимо от того, работают ли они на CPython или что-то еще) медленнее в долгосрочной перспективе.

Так как он интерпретируется и не компилируется.. он должен быть медленнее во время выполнения.

как таблица, упомянутая в код завершен (второе издание) книга, страница 600,

C# равно C++ в срок исполнения (1:1). И Python медленнее более чем в сто раз, чем C++ в срок исполнения (>100:1).

и Java медленнее, чем C++ в полтора раза (1,5:1).

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

Comments

    Ничего не найдено.