Подтвердить что ты не робот

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

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

performance-comparison-c-java-python-ruby-jython-jruby-groovy

Вот проект, который оптимизирует CPython: unladen-swallow

4b9b3361

Ответ 1

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

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

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

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

  • IronPython полагается на те же библиотеки .NET и IL, что и на С#, поэтому разница в производительности будет относительно небольшой.

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Как упоминалось в других ответах, это зависит от системы времени выполнения, а также от задачи. Таким образом, стандартный (C) Python не обязательно медленнее, чем Java или С#. Некоторые из его модулей реализованы на C. Таким образом, сочетание скорости собственной реализации с языком 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 text http://www.mycsharp.de/wbb2/attachment.php?attachmentid=6909&sid=0d5aa62b522d005d9e7089785b5d19f1

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

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

Ответ 4

Просто - 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, любит разработку webapps в Django/Flask/Pyramid, а не Spring (Java). Но я вижу практически в своей работе и опыте, как Python работает медленнее. Скорость - это не всегда мой приоритет. Но я поддерживаю их, которые говорят, что Python Interpreter должен получать смазку, смазку или полное изменение двигателя, по крайней мере, в марафоне. Это основной язык программирования.

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

То, что у вас есть, - это яркий пример написания 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  

Немного больше pythonic:

 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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

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

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

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

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