Вопрос

Я работаю над проектом с использованием Hadoop, и, похоже, он изначально включает Java и обеспечивает поддержку потоковой передачи для Python.Оказывает ли выбор одного метода существенного влияния на производительность?Я нахожусь на достаточно ранней стадии процесса и могу пойти в любом направлении, если в ту или иную сторону существует значительная разница в производительности.

Это было полезно?

Решение

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

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

Другие советы

С Python вы, вероятно, будете разрабатывать быстрее, а с Java определенно будете работать быстрее.

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

Тем не менее, в наши дни мало что связано с процессором, поэтому, если вы чувствуете, что с Python вам будет лучше развиваться, дерзайте!


В ответ на комментарий (как Java может быть быстрее Python):

Все языки обрабатываются по-разному.Java является примерно самым быстрым после C и C++ (который может быть таким же быстрым или в 5 раз быстрее, чем Java, но, похоже, в среднем примерно в 2 раза быстрее).Остальные в 2-5+ раз медленнее.Python — один из самых быстрых после Java.Я предполагаю, что C# примерно так же быстр, как Java, или, может быть, быстрее, но в игре для тестов был только Mono (который был немного медленнее), потому что они не запускали его в Windows.

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

Например, этот показаны все тесты с использованием Java и C++, и вы можете видеть, что скорость варьируется примерно в 3 раза медленнее Java (первый столбец находится между 1 и 3), а Java использует гораздо больше памяти!

Сейчас эта страница показывает Java vs Python (с точки зрения Python).Таким образом, скорости варьируются от Python в 2 раза медленнее, чем Java, до 174 раз медленнее, хотя Python обычно превосходит Java по размеру кода и использованию памяти.

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

Кстати, это Python 3, другая протестированная платформа Python (просто называемая Python) показала себя намного хуже.

Если вы действительно хотели знать как это быстрее, виртуальная машина удивительно умна.Он компилируется в машинный язык ПОСЛЕ запуска кода, поэтому он знает наиболее вероятные пути кода и оптимизирует их.Распределение памяти — это искусство, очень полезное в объектно-ориентированном языке.Он может выполнять удивительные оптимизации во время выполнения, которые не может сделать ни один язык, кроме VM.При необходимости он может работать с довольно небольшим объемом памяти и является предпочтительным языком для встраиваемых устройств наряду с C/C++.

Я работал над анализатором сигналов для Agilent (думаю, дорогой o-scope), где почти все (кроме выборки) было сделано на Java.Это включает в себя рисование экрана, включая трассировку (AWT), и взаимодействие с элементами управления.

В настоящее время я работаю над проектом всех будущих кабельных коробок.Руководство, как и большинство других приложений, будет написано на Java.

Почему бы это не было быстрее, чем Python?

Преобразования Hadoop Mapreduce можно записать либо как «потоковую передачу», либо как «пользовательский jar».Если вы используете потоковую передачу, вы можете писать свой код на любом языке, который вам нравится, включая Python или C++.Ваш код будет просто читать из STDIN и выводить в STDOUT.Однако в версиях Hadoop до 0.21 потоковая передача Hadoop использовалась для потоковой передачи только текста, а не двоичного кода, в ваши процессы.Поэтому ваши файлы должны быть текстовыми файлами, если только вы сами не выполняете какие-то странные преобразования кодировки.Но теперь, похоже, пластырь было добавлено, что теперь позволяет использовать двоичные форматы с потоковой передачей Hadoop.

Если вы используете «пользовательский jar» (т.е.вы написали код Mapreduce на Java или Scala с использованием библиотек Hadoop), тогда у вас будет доступ к функциям, которые позволяют вводить и выводить двоичные данные (сериализовать в двоичном формате) из ваших потоковых процессов (и сохранять результаты на диск).Таким образом, будущие запуски будут намного быстрее (в зависимости от того, насколько ваш двоичный формат меньше текстового формата).

Таким образом, если ваша работа Hadoop будет связана с вводом-выводом, тогда подход «пользовательский jar» будет быстрее (поскольку как Java быстрее, как показали предыдущие плакаты, так и чтение с диска также будет быстрее).

Но вы должны спросить себя, насколько ценно ваше время.Я считаю себя гораздо более продуктивным с Python, и написать Map-Reduce, который читает STDIN и записывает в STDOUT, действительно просто.Поэтому я лично рекомендовал бы пойти по пути Python - даже если вам придется самостоятельно разбираться в двоичном кодировании.Поскольку Hadoop 0.21 обрабатывает массивы байтов, отличные от utf8, и поскольку существует альтернатива бинарному массиву (байтовый массив), которую можно использовать для Python (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/), который показывает, что код Python примерно на 25% медленнее, чем Java-код «пользовательского jar», я бы определенно пошел по пути Python.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top