Почему Python не лучше в многопроцессорных или многопоточных приложениях, чем Java? - PullRequest
7 голосов
/ 22 июня 2011

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

Ответы [ 3 ]

17 голосов
/ 22 июня 2011

Самая большая проблема в многопоточности в CPython - Глобальная блокировка интерпретатора (GIL) (обратите внимание, что другие реализации Python не обязательно разделяют эту проблему!)

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

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

Однако в многоядерных / SMP-компьютерах это становится узким местом (и они становятся все более распространенными с каждой минутой).

Java не имеет таких ограничений, поэтому несколько потоков могут выполняться одновременно.

2 голосов
/ 28 октября 2013

Я бы не согласился с тем, что Python не лучше, чем Java для многопроцессорных приложений.

Во-первых, я предполагаю, что ОП, насколько я могу судить, использует слово «лучше», что означает «более быстрое выполнение кода».

Я страдаю от синдрома «скоростного безумца», возможно, из-за того, что пришел из C / ASM, поэтому я потратил много времени, чтобы понять, «медленно ли Python?» вопрос.

Простой ответ на этот вопрос? "Может быть." Вот несколько важных моментов:

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

2) В многопроцессорном приложении GIL на самом деле не применяется, и, таким образом, теперь вы можете приступить к более быстрому выполнению кода Python, по большей части GIL. Я настоятельно рекомендую, если вы хотите написать большой код на Python, который требует как скорости, так и параллелизма, вы узнаете о многопроцессорности и, возможно, ZMQ / 0MQ для передачи сообщений.

3) Независимо от GIL, Java отображает более быстрое выполнение кода, чем Python во многих областях. Это связано с собственными различиями в том, как Python обрабатывает объекты в памяти:

  • Ряд функций Python создают копии объектов в памяти, а не модифицируют их (см. http://www.skymind.com/~ocrow/python_string/ для примеров)

  • Python использует Dict для хранения атрибутов объектов и т. Д. Я не хочу отвлекать внимание и углубляться в эти области, но в целом я могу сказать, что некоторые из «изящных» вещей, которые Python может сделать, достигают скорость стоимость. Также важно знать, что есть способы обойти поведение по умолчанию, если это приводит к слишком высокому штрафу за скорость.

4) Насколько я могу судить, некоторые преимущества Java в скорости связаны с большей оптимизацией Java VM по сравнению с Python. Как только вы устраняете различия в том, как много закулисной работы с памятью / объектами выполняется, Java все еще может побеждать Python. Это потому, что у Java больше внимания, чем у Python? Я не уверен, с достаточным финансированием я чувствую, что CPython мог бы быть быстрее.

Я скажу, что я решил использовать Python почти на 100% в будущем с новым кодом.

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

Интересные тесты:

http://benchmarksgame.alioth.debian.org/u64/python.php

Дополнительную информацию о проблемах со скоростью Python можно найти здесь:

http://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715

0 голосов
/ 22 июня 2011

Я думаю, что вы ответили на свой вопрос. У Python есть проблемы из-за "Глобальной блокировки интерпретатора" (GIL).

Первое попадание в Google для "python gil": http://www.grouplens.org/node/244

...