Python vs Java-что бы вы выбрали для параллельного программирования и почему? [закрытый]
Кроме того, если бы не python или java,то вы бы выбрали статически типизированный язык или язык динамического типа?
11 ответов:
Я бы выбрал JVM вместо python, прежде всего потому, что многопоточность в Python затруднена блокировкой глобального интерпретатора . Однако Java вряд ли будет вашим лучшим решением при работе на JVM. Clojure илиScala (с использованием акторов), вероятно, лучше подходят для многопоточных задач.
Если вы выберете Java, вам следует рассмотреть возможность использования Ява.утиль.одновременный библиотеки и избегать многопоточных примитивов, таких как синхронизировано .
Определенно Stackless Python ! Что вариант Python специально создан для параллелизма.
Но в конечном счете все зависит от вашей целевой платформы и того, чего вы пытаетесь достичь.
Для параллелизма я бы использовал Java. Под использованием Java я на самом деле подразумеваю Scala, которая заимствует многое из конструкций параллелизма Erlang, но (вероятно) более доступна для разработчика Java, который никогда не использовал ни то, ни другое раньше.
Потоки Python страдают от необходимости ждать глобальной блокировки интерпретатора, что делает истинный параллелизм (в рамках одного процесса) недостижимым для программ, привязанных к ЦП. Как я понимаю, Stackless Python решает некоторые (хотя и не все) задачи параллелизма CPython недостатки, но так как я им не пользовался, то не могу ничего по этому поводу посоветовать.
Я не думаю, что речь идет о выборе языка или статическом или динамическом типировании-это между двумя моделями параллелизма-общей памятью и передачей сообщений. Какая модель имеет больше смысла в вашей ситуации и позволяет ли выбранный вами язык сделать выбор или вы вынуждены принять одну модель вместо другой?
Почему бы не взглянуть на Erlang (который имеет динамическую типизацию) и передачу сообщений, Модель актера и прочитать, Почему Джо Армстронг не делает этого например, общая память . Существует также интересная дискуссия о параллелизме java с использованием блокировок и потоков здесь на SO.
Я не знаю о Python, но Java, наряду со встроенной моделью блокировок и потоков, имеет mesasge передающий фреймворк под названием Kilim.
Если бы не Java/Python, я бы выбрал функциональный язык, поскольку учет побочных эффектов является одной из сложностей написания параллельного программного обеспечения. (Что касается вашего вопроса: этот тип статически типизирован, но компилятор выводит большую часть времени)
Лично я выбрал бы F#, так как я видел много хороших примеров написания параллельного программного обеспечения с легкостью его использования.
В качестве введения: этот человек одинаково забавен, как и вдохновляющий , даже должно быть, видели, если вы не заинтересованы в F# что так всегда.
Я бы использовал Java, через Jython. Java имеет сильные возможности потока, и он может быть написан с использованием синтаксиса Python с Jython, так что вы получили лучшее из двух миров.
Python сам по себе не очень хорош с параллелизмом и все равно медленнее Java.
Но если у вас есть проблемы с параллелизмом и свободными руками, я бы посмотрел на Erlang, потому что он был разработан для таких проблем. Конечно, вы должны рассматривать Эрланг только в том случае, если у вас есть:
- время освоить (очень) новое технология
- контроль на разумной части производственной цепочки, так как Erland нужны некоторые адаптации в вашем наборе инструментов, чтобы соответствовать
Ни. Параллельное программирование, как известно, трудно исправить. Существует возможность использования процессно-ориентированного языка программирования, такого как occam-pi, который основан на идее связывания последовательных процессов и исчисления pi. Это позволяет проверять время компиляции на наличие взаимоблокировки и многих других проблем, возникающих при параллельной разработке систем. Если вам не нравится occam-pi, в чем я не могу винить вас, если вы этого не сделаете, вы можете попробовать Перейти новый язык от google, который также реализует версию CSP.
Для некоторых задач Python работает слишком медленно. Ваша однопоточная Java-программа может работать быстрее, чем параллельная версия Python на многоядерном компьютере...
Я хотел бы использовать Java или Scala, F# или просто перейти на C++(MPI и OpenMPI).
Среда Java (JVM + библиотеки)лучше подходит для параллелизма, чем (C) Python, но Java-язык отстой. Я бы, вероятно, пошел с другим языком на JVM - Jython уже упоминался, и Clojure и Scala имеют отличную поддержку параллелизма.
Clojure особенно хорош - он поддерживает высокопроизводительные постоянные структуры данных, агенты и программную транзакционную память. Это динамический язык, но вы можете дать ему подсказки типа, чтобы получить производительность не хуже Java.Смотрите это видео на InfoQ Ричарда Хикки (создателя Clojure) о проблемах с традиционными подходами к параллелизму и о том, как Clojure его обрабатывает.
Я бы посмотрел на Objective-C и базовую структуру. Асинхронное, параллельное программирование хорошо предусмотрено.
Это, конечно, зависит от вашего доступа к инструментам разработчика Apple или GnuStep, но если у вас есть доступ к любому из них, это хороший маршрут для параллельного программирования.
Ответ заключается в том, что это зависит. Например, вы пытаетесь использовать преимущества нескольких ядер или процессоров на одной машине или хотите распределить свою задачу между многими машинами? Насколько важна скорость и простота реализации?
Как упоминалось ранее, Python имеет глобальную блокировку интерпретатора, но вы можете использовать модуль multiprocessing. Обратите внимание, что хотя Stackless очень крут, он не будет использовать несколько ядер самостоятельно. Питон обычно является считать легче работать, чем Java. Если скорость является приоритетом, Java обычно быстрее.
Библиотека
java.util.concurrent
в Java упрощает написание параллельных приложений на одной машине, но вам все равно придется синхронизировать их с любым общим состоянием. Хотя Java не обязательно является лучшим языком для параллелизма, существует множество инструментов, библиотек, документации и лучших практик, которые могут помочь.Использование передачи сообщений и неизменяемости вместо потоков и общего состояния является рассматривается лучший подход к программированию параллельных приложений. В результате часто отдается предпочтение функциональным языкам, которые препятствуют изменчивости и побочным эффектам. Если требуется распределить ваши параллельные приложения между несколькими машинами, стоит посмотреть на время выполнения, предназначенное для этого, например Erlang или Scala Actors.