Python, Java, C # и параллельные алгоритмы - PullRequest
2 голосов
/ 10 июня 2011

Мне было интересно: есть ли смысл пытаться создавать параллельные алгоритмы в Python? Скажем, я хочу исследовать новый параллельный алгоритм, и у меня есть выбор C, C # и Python, будет ли один или другой «лучше» для тестирования и тестирования этих алгоритмов, или они просто «функционально эквивалентны» и, помимо константы, связанные с интерпретируемыми / скомпилированными / vm языками, это все будет одинаково? Спасибо

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

Python не подходит для этого из-за глобальной блокировки интерпретатора (GIL), он не работает таким образом.C трудно использовать в многопоточной среде, но есть альтернатива - Cilk язык.C # - хороший выбор для параллельного программирования.Вы можете использовать Task Parallel Library, параллельные структуры данных и PLINQ из .NET Framework 4.

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

Я бы определенно использовал Python, потому что писать программы на Python быстро и легко, и потому что он, вероятно, уже включает в себя все инструменты, которые вам понадобятся.Это позволит вам сосредоточиться на алгоритме, а не работать над синтаксисом и объявлениями.

Для бенчмаркинга вы можете использовать модуль cProfile или timeit .

Какие параллельные алгоритмы вы хотите протестировать?Есть много способов сделать параллельное программирование.Для алгоритмов, которые необходимо масштабировать до множества процессов, возможно, самый простой способ - использовать MPI . mpi4py является очень хорошей реализацией для Python и тесно интегрирована с numpy , если вам нужно работать с массивами чисел.

Как уже упоминалось, многопоточность может использовать только 1 процессор из-за GIL .Но это ограничение относится только к этому случаю.Вы можете использовать многопроцессорную обработку на любом количестве процессоров.

Наконец, в Python есть инструменты для функционального программирования сопрограмм может быть отлично подходит для параллельного программирования.

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

C имеет много альтернатив, но это язык низкого уровня. Intel Thread Building Blocks - это коммерческая параллельная библиотека на базе Cilk, которая, как я слышал, хороша.

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

Java, вероятно, ваш лучший выбор. Ключевое слово synchronized, а также приличные примитивы (например, неблокируемая очередь без блокировки) делают его относительно приятным. Хотя Java старая, поэтому вы тратите время на написание более подробного кода, чем Python.

Я медленно (постепенно) изучаю параллелизм в Хаскеле. Кажется, не так-то просто получить эффективный запуск, но если ваша задача довольно параллельна, то, похоже, она работает хорошо. И, конечно, Haskell невероятно выразителен (после того, как вы справитесь с этим, он сильно отличается синтаксически - по понятной причине, imho), и, поскольку он функционален, у вас не возникает странных проблем с повреждением состояния; в худшем случае ваш код не масштабируется. Существует множество библиотек, таких как STM (программная транзакционная память), которые, кажется, решают определенные проблемы намного лучше (в теории), чем примитивы, которые используют императивные программисты, такие как блокировки.

...