Python vs Bash-в каких задачах каждый из них превосходит другой по производительности?



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



каков ваш опыт в этом вопросе? В какой задаче каждый из них является явным победителем?

1025   10  

10 ответов:

общая схема ЭВМ...

Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
                                   |                          ^
                                   v                          |
                                   `--> COBOL Program --------' 

Типичный поток Linux...

Input Disk/SSD/User (runtime) --> sh/bash/ksh/zsh/... ----------> Output Disk/SSD/Screen/Printer
                                   |                          ^
                                   v                          |
                                   `--> Python script --------'
                                   |                          ^
                                   v                          |
                                   `--> awk script -----------'
                                   |                          ^
                                   v                          |
                                   `--> sed script -----------'
                                   |                          ^
                                   v                          |
                                   `--> C/C++ program --------'
                                   |                          ^
                                   v                          |
                                   `--- Java program ---------'
                                   |                          ^
                                   v                          |
                                   :                          :

оболочки-это клей Linux

оболочки Linux, такие как sh/ksh/Баш/... обеспечьте средства обозначения вход-выхода / регулирования потока очень как старый язык управлением работы универсального... но на стероидах! Они Turing complete languages в своем собственном праве при оптимизации для эффективной передачи данных и управления К и от других исполняющих процессов, написанных на любом языке, который поддерживает O/S.

большинство приложений Linux, независимо от того, на каком языке написана основная часть программы, зависят от сценариев оболочки и Баш стал самым распространенным. При нажатии на значок на рабочем столе обычно выполняется короткий Баш сценарий. Этот скрипт, прямо или косвенно, знает, где находятся все необходимые файлы, и устанавливает переменные и параметры командной строки, наконец, вызывая программа. Это самое простое использование оболочки.

оболочки предоставляют инфраструктуру, которая позволяет нам использовать готовые компоненты, связанные вместе во время выполнения, а не во время компиляции. Эти компоненты являются самостоятельными программами сами по себе, которые могут быть использованы в одиночку или в других комбинациях без перекомпиляции. Синтаксис для их вызова неотличим от синтаксиса a Баш встроенная команда, и на самом деле существует множество встроенных команд, для которых также есть автономный исполняемый файл в системе, часто имеющий дополнительные параметры.

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

любой из известных инструментов, таких как awk, sed, grep, bc, dc, tr, etc. оставит выполнение этих операций на любом языке в пыли. Баш тогда предпочтительнее для чего-либо без графического пользовательского интерфейса, так как проще и эффективнее вызывать и передавать данные обратно из инструмента, подобного тем, с Баш чем Python.

производительность

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

пользователь Интерфейс

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

Баш понимает только текст. Другие инструменты должны быть вызваны для графического интерфейса и данных, передаваемых от них. А Python скрипт-это один из вариантов. Более быстрые, но менее гибкие варианты двоичные файлы, как YAD, Zenity и GTKDialog.

в то время как снаряды типа Баш хорошо работать с графическими интерфейсами, как яд,GtkDialog (встроенный XML-подобный интерфейс для функций GTK+), и xmessage,Python обычно легче и способнее.

резюме

построение с помощью сценариев оболочки похоже на сборку компьютера с готовыми компонентами таким образом настольные ПК есть.

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

Как правило, bash работает лучше, чем python, только в тех средах, где python недоступен. :)

серьезно, я должен иметь дело с обоими языками ежедневно, и будет принимать python мгновенно над Баш, если дать выбор. Увы, я вынужден использовать bash на некоторых "маленьких" платформах, потому что кто-то (ошибочно, IMHO) решил, что python "слишком большой", чтобы соответствовать.

хотя это правда, что bash может быть быстрее, чем python для некоторых выбранных задач, это никогда не может быть так быстро разрабатывать или так же легко поддерживать (по крайней мере, после того, как вы пройдете 10 строк кода или около того). Единственная сильная сторона Bash wrt python или ruby или lua и т. д. это его вездесущность.

эффективность разработки имеет гораздо большее значение для меня в сценариях, где и bash и Python являются разумным выбором.

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

большое преимущество Python имеет в угловых случаях вокруг обработки файлов, в то время как он имеет Глоб,shutil, подпроцесс, и другие для общих потребностей сценариев.

при написании скриптов производительность не имеет значения (в большинстве случаев).
Если вы заботитесь о производительности "Python vs Bash" - это ложный вопрос.

Python:
+ проще писать
+ легче поддерживать
+ более простое повторное использование кода (попробуйте найти универсальный способ защиты от ошибок, чтобы включить файлы с общим кодом в sh, смею тебя)
+ вы можете сделать ООП с ним тоже!
+ более простой разбор аргументов. ну, не проще, точно. это все еще будет быть слишком многословным на мой вкус, но питон есть argparse встроенный объект.
- уродливый уродливый "подпроцесс". попробуйте цепочку команд и не плакать реку, как уродливый ваш код станет. особенно если вы заботитесь о кодах выхода.

Баш:
+ вездесущность, как было сказано ранее, действительно.
+ простые команды цепочки. вот как вы склеиваете различные команды простым способом. Также Bash (не sh) есть некоторые улучшения, такие как pipefail, так что цепочки очень коротко и выразительно.
+ не требуют 3-участник программы должен быть установлен. может быть выполнен сразу же.
- боже, он полон подводных камней. ЕСЛИ ДА, ТО CDPATH.. их тысячи.

если один пишет сценарий больше, чем 100 LOC: выберите Python
Если вам нужна манипуляция пути в скрипте: выберите Python (3)
Если нужно что-то вроде alias но немного сложнее: выбрать Bash / sh

в любом случае, нужно попробовать обе стороны, чтобы понять, на что они способны.

возможно, ответ может быть расширен с помощью точек поддержки упаковки и IDE, но я не знаком с этими сторонами.

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

производительность bash превосходит python во время запуска процесса.

вот некоторые измерения с моего ноутбука core i7 под управлением Linux Mint:

Starting process                       Startup time

empty /bin/sh script                   1.7 ms
empty /bin/bash script                 2.8 ms
empty python script                    11.1 ms
python script with a few libs*         110 ms

*загруженные библиотеки Python: os, os.путь в JSON, время, просит, продевать нитку, подпроцесс

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

Если вам не все равно о производительности используйте bash только для:

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

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

Что быстрее? Ни то, ни другое, потому что вы не сравниваете яблоки с яблоками здесь. Если вам нужно было отсортировать текстовый файл ascii, и вы использовали такие инструменты, как zcat, sort, uniq и sed, то вы будете курить производительность Python.

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

Если вы хотите собрать быструю утилиту с минимальными усилиями, bash хорош. Для обертки вокруг приложения, bash бесценен.

все, что может заставить вас возвращаться снова и снова, чтобы добавить улучшения, вероятно (хотя и не всегда) лучше подходит для такого языка, как Python, поскольку код Bash, содержащий более 1000 строк, становится очень болезненным для поддержания. Код Bash также раздражает отладку, когда он становится длинным.......

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

есть 2 сценария, где производительность Bash по крайней мере равна я считаю:

  • Скрипты утилит командной строки
  • Скрипты, выполнение которых занимает совсем немного времени; где запуск интерпретатора Python занимает больше времени, чем сама операция

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

Я не знаю, если это точно, но я обнаружил, что python/ruby работает гораздо лучше для сценариев, которые имеют много математических вычислений. В противном случае вы должны использовать dc или какой-то другой"калькулятор произвольной точности". Это просто становится очень большой болью. С python у вас гораздо больше контроля над поплавками против ints, и гораздо проще выполнять много вычислений и иногда.

в частности, я бы никогда не работал со скриптом bash для обработки двоичной информации или байты. Вместо этого я бы использовал что-то вроде python (возможно) или C++ или даже Node.JS.

Это очень открытый вопрос. Другие ответы хороши, но давайте откроем другую перспективу.

Баш ограничения:

  1. трудно читать, повторно использовать и поддерживать. Чтобы решить некоторые проблемы, часто нужно написать странный и сложный код
  2. производительность очень низкая, если вы хотите выполнить больше, чем задачи" OS glue"

Python приятно, но для java-мыслящих разработчиков (таких как я), это вероятно, не так богат, как java. С другой стороны, он не может конкурировать с bash в отношении инструментов низкого уровня (awk, sed, grep...) и управление ОС.

лучшим миром было бы эффективное сочетание вызовов методов bash и java, с:

  • высокая производительность
  • высокая читаемость
  • полный доступ к Вселенной bash
  • полный доступ к пакетам java

именно это и есть цель bashj a bash мутант с поддержкой java (https://sourceforge.net/projects/bashj/), который охватывает эти цели и некоторые другие. Вы можете смешивать java-код (определения функций и вызовы функций) со стандартным bash в скрипте bashj. Это моя любимая замена для bash.

Comments

    Ничего не найдено.