Python по сравнению с Java — Который Вы выбрали бы, чтобы сделать параллельное программирование и почему? [закрытый]

Lisp

(defun x() (x)) (x)
8
задан Mike Pennington 24 November 2011 в 15:46
поделиться

11 ответов

Я бы предпочел JVM python, в первую очередь потому, что многопоточность в Python затрудняется глобальной блокировкой интерпретатора . Однако Java вряд ли будет лучшим вариантом при работе на JVM. Clojure или Scala (с использованием акторов), вероятно, лучше подходят для многопоточных задач.

Если вы все же выбираете Java, вам следует рассмотреть возможность использования java.util.concurrent и избегайте многопоточных примитивов, таких как synchronized .

27
ответ дан 5 December 2019 в 04:29
поделиться

Определенно Безстековый Python ! Это вариант Python, специально созданный для параллелизма.

Но, в конце концов, это зависит от вашей целевой платформы и того, чего вы пытаетесь достичь.

11
ответ дан 5 December 2019 в 04:29
поделиться

Для параллелизма я бы использовал Java. Под использованием Java я на самом деле имею в виду Scala , который многое заимствует у конструкций параллелизма Erlang, но (вероятно) более доступен для Java-разработчика, который никогда не использовал ни то, ни другое раньше.

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

10
ответ дан 5 December 2019 в 04:29
поделиться

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

Почему бы не взглянуть на Erlang (который имеет динамическая типизация) и передача сообщений , модель актера , и прочтите, почему Джо Армстронг не любит разделяемую память . Также есть интересное обсуждение параллелизма Java с использованием блокировок и потоков здесь, на SO .

Я не знаю о Python, но Java, вместе со встроенной моделью блокировок и потоков,

5
ответ дан 5 December 2019 в 04:29
поделиться

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

Лично я бы выбрал F #, так как я видел множество хороших примеров написания параллельного программного обеспечения с легкостью с его использованием. .

В качестве введения: этот человек одинаково увлекателен, как и вдохновляет , даже если вы вообще не интересуетесь F #.

4
ответ дан 5 December 2019 в 04:29
поделиться

Я бы использовал Java через Jython. Java имеет сильные потоковые возможности, и его можно написать с использованием синтаксиса Python с Jython, так что вы получите лучшее из двух миров.

Сам Python не очень хорош с параллелизмом, и в любом случае он медленнее, чем Java.

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

  • время, чтобы освоить (очень) новую технологию
  • контроль над разумной частью производственной цепочки, поскольку Erland нуждается в некоторых адаптациях в вашем наборе инструментов, чтобы соответствовать
2
ответ дан 5 December 2019 в 04:29
поделиться

Ни то, ни другое. Как известно, параллельное программирование сложно исправить. Существует возможность использования языка программирования, ориентированного на процессы, такого как occam-pi , который основан на идее обмена последовательными процессами и исчислении пи . Это позволяет проверять время компиляции на наличие взаимоблокировок и многих других проблем, которые возникают во время параллельной разработки систем. Если вам не нравится occam-pi, в чем я не могу вас винить, вы можете попробовать Go , новый язык от Google, который также реализует версию CSP.

2
ответ дан 5 December 2019 в 04:29
поделиться

Для некоторых задач Python работает слишком медленно. Ваша однопоточная программа Java может быть быстрее, чем параллельная версия Python на многоядерном компьютере ...

Я бы хотел использовать Java или Scala, F # или просто перейти на C ++ (MPI и OpenMPI).

1
ответ дан 5 December 2019 в 04:29
поделиться

Среда Java (JVM + библиотеки) лучше для параллелизма, чем (C) Python, но язык Java - отстой. Я бы, вероятно, выбрал другой язык для JVM - Jython уже упоминался, а Clojure и Scala имеют отличную поддержку параллелизма.

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

Посмотрите это видео на InfoQ Ричарда Хики (создателя Clojure) о проблемах с традиционными подходами к параллелизму. , и как Clojure с этим справляется.

1
ответ дан 5 December 2019 в 04:29
поделиться

Я бы посмотрел на Objective-C и Foundation Framework. Асинхронное параллельное программирование хорошо предусмотрено.

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

1
ответ дан 5 December 2019 в 04:29
поделиться

Ответ, что это зависит. Например, пытаетесь ли вы воспользоваться преимуществами нескольких ядер или cpus на одной машине, или вы хотите распределить задачу по многим машинам? Насколько важна скорость в сравнении с простотой реализации?

Как упоминалось ранее, у Python есть Global Interpreter Lock, но вы можете использовать мультипроцессорный модуль. Обратите внимание, что хотя Stackless очень крут, он сам по себе не будет использовать несколько ядер . Обычно считается, что с Python легче работать, чем с Java. Если скорость является приоритетом, то Java обычно быстрее.

Библиотека java.util.concurrent в Java делает написание параллельных приложений на одной машине проще, но вам все равно придется синхронизироваться вокруг любого общего состояния. Хотя Java не обязательно является лучшим языком для параллельной работы, существует множество инструментов, библиотек, документации и передового опыта, которые могут помочь в этом.

Использование передачи сообщений и неизменяемости вместо потоков и общего состояния считается лучшим подходом к программированию параллельных приложений. В результате часто предпочтение отдается функциональным языкам, которые не допускают мутаций и побочных эффектов. Если необходимо распределить одновременные приложения по нескольким машинам, то стоит обратить внимание на время выполнения, предназначенное для этого, например, Erlang или Scala Actors.

.
1
ответ дан 5 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

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