Typowy przepływ w komputerze mainframe ...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
Typowy przepływ Linuksa ...
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 |
: :
Powłoki są klejem Linuksa
Powłoki Linuksa, takie jak sh / ksh / bash / ..., zapewniają funkcje wyznaczania wejścia / wyjścia / kontroli przepływu, podobnie jak stary język sterowania zadaniami na komputerze mainframe ... ale na sterydach! Są kompletnymi językami Turinga , będąc jednocześnie zoptymalizowanymi pod kątem wydajnego przekazywania danych i kontroli do iz innych procesów wykonawczych napisanych w dowolnym języku obsługiwanym przez system operacyjny.
Większość aplikacji Linuksa, niezależnie od języka, w którym napisana jest większość programu, zależy od skryptów powłoki, a Bash stał się najbardziej powszechny. Kliknięcie ikony na pulpicie zwykle uruchamia krótki skrypt Bash . Ten skrypt, bezpośrednio lub pośrednio, wie, gdzie znajdują się wszystkie potrzebne pliki i ustawia zmienne oraz parametry wiersza poleceń, ostatecznie wywołując program. To najprostsze zastosowanie powłoki.
Linux, jaki znamy, nie byłby Linuksem bez tysięcy skryptów powłoki, które uruchamiają system, reagują na zdarzenia, kontrolują priorytety wykonywania oraz kompilują, konfigurują i uruchamiają programy. Wiele z nich jest dość dużych i złożonych.
Powłoki zapewniają infrastrukturę, która pozwala nam używać gotowych komponentów, które są ze sobą połączone w czasie wykonywania, a nie w czasie kompilacji. Komponenty te są samodzielnymi programami, których można używać samodzielnie lub w innych kombinacjach bez konieczności ponownej kompilacji. Składnia ich wywoływania jest nie do odróżnienia od składni wbudowanego polecenia Bash , aw rzeczywistości istnieje wiele wbudowanych poleceń, dla których istnieje również samodzielny plik wykonywalny w systemie, często mający dodatkowe opcje.
Nie ma różnicy w wydajności między językami Python i Bash . Zależy to całkowicie od sposobu kodowania każdego z nich i wywoływanych narzędzi zewnętrznych.
Każde z dobrze znanych narzędzi, takich jak awk, sed, grep, bc, dc, tr itp., Pozostawi wykonywanie tych operacji w dowolnym języku na uboczu. Bash jest zatem preferowany w przypadku wszystkiego, co nie ma graficznego interfejsu użytkownika, ponieważ wywoływanie i przekazywanie danych z narzędzia takiego jak Bash jest łatwiejsze i bardziej wydajne niż z Pythona .
Występ
Zależy to od programów wywoływanych przez skrypt powłoki Bash i ich przydatności do podanego podzadania, czy ogólna przepustowość i / lub responsywność będą lepsze, czy gorsze niż w równoważnym Pythonie . Aby skomplikować sprawę, Python , podobnie jak większość języków, może również wywoływać inne pliki wykonywalne, chociaż jest to bardziej uciążliwe i przez to rzadziej używane.
Interfejs użytkownika
Jednym z obszarów, w którym Python jest wyraźnym zwycięzcą, jest interfejs użytkownika. To sprawia, że jest to doskonały język do tworzenia aplikacji lokalnych lub klient-serwer, ponieważ natywnie obsługuje grafikę GTK i jest znacznie bardziej intuicyjny niż Bash .
Bash rozumie tylko tekst. Inne narzędzia muszą być wywoływane w celu uzyskania GUI i danych zwrotnych z nich. Python skrypt jest jedna opcja. Szybszymi, ale mniej elastycznymi opcjami są pliki binarne, takie jak YAD, Zenity i GTKDialog .
Podczas gdy powłoki takie jak Bash działają dobrze z GUI, takimi jak Yad , GtkDialog (osadzony interfejs podobny do XML z funkcjami GTK +) , dialog i xmessage , Python jest znacznie bardziej wydajny i lepszy dla złożonych okien GUI.
Podsumowanie
Budowanie za pomocą skryptów powłoki przypomina składanie komputera z gotowymi komponentami, tak jak komputery stacjonarne.
Budowanie za pomocą Pythona , C ++ lub większości innych języków przypomina raczej budowanie komputera przez lutowanie układów scalonych (bibliotek) i innych części elektronicznych, tak jak smartfony.
Najlepsze wyniki zwykle uzyskuje się, używając kombinacji języków, w których każdy może robić to, co robi najlepiej. Jeden z programistów nazywa to „ programowaniem poliglotowym ”.
Ogólnie bash działa lepiej niż python tylko w tych środowiskach, w których python nie jest dostępny. :)
Poważnie, muszę codziennie radzić sobie z oboma językami i jeśli dana mi możliwość wyboru, od razu przejmę Pythona nad bash. Niestety, jestem zmuszony używać basha na pewnych „małych” platformach, ponieważ ktoś (omyłkowo, IMHO) zdecydował, że Python jest „za duży”, aby się zmieścić.
Chociaż prawdą jest, że bash może być szybszy niż Python w przypadku niektórych wybranych zadań, nigdy nie może być tak szybki, ani tak łatwy w utrzymaniu (przynajmniej po przekroczeniu 10 linii kodu). Jedyną mocną stroną Basha w stosunku do pythona, rubinu, lua itp. Jest jego wszechobecność.
źródło
os
lubshutil
modułu.Wydajność programisty ma dla mnie znacznie większe znaczenie w scenariuszach, w których zarówno bash, jak i Python są rozsądnymi wyborami.
Niektóre zadania dobrze nadają się do basha, a inne do Pythona. Nie jest też niezwykłe, że zaczynam coś jako skrypt bash i zmieniam go na Pythona, ponieważ ewoluuje przez kilka tygodni.
Dużą zaletą Pythona są narożne przypadki związane z obsługą nazw plików, podczas gdy ma on glob , shutil , podproces i inne dla typowych potrzeb skryptów.
źródło
Podczas pisania skryptów wydajność nie ma znaczenia (w większości przypadków).
Jeśli zależy Ci na wydajności 'Python vs Bash' to fałszywe pytanie.
Python :
+ łatwiejszy do pisania
+ łatwiejszy w utrzymaniu
+ łatwiejsze ponowne wykorzystanie kodu (spróbuj znaleźć uniwersalny, odporny na błędy sposób dołączania plików ze wspólnym kodem
sh
, ośmielam się)+ możesz też z nim zrobić OOP!
+ łatwiejsze analizowanie argumentów. cóż, nie łatwiej, dokładnie. nadal będzie to zbyt rozwlekłe jak na mój gust, ale Python ma
argparse
wbudowaną funkcję .- brzydki brzydki „podproces”. spróbuj łączyć polecenia i nie wypłakiwać rzeki, jak brzydki stanie się twój kod. zwłaszcza jeśli zależy Ci na kodach wyjścia.
Bash :
+ wszechobecność, jak powiedziano wcześniej, rzeczywiście.
+ łańcuch prostych poleceń. w ten sposób w prosty sposób sklejasz ze sobą różne polecenia. Również
Bash
(niesh
) mają pewne ulepszenia, na przykładpipefail
, więc łańcuchy są naprawdę krótkie i wyraziste.+ nie wymagają instalowania programów innych firm. można wykonać od razu.
- Boże, jest pełna pułapek. IFS, CDPATH… tysiące z nich.
Jeśli piszesz skrypt większy niż 100 LOC: wybierz Python
Jeśli potrzebujesz manipulacji ścieżką w skrypcie: wybierz Python (3)
Jeśli potrzebujesz trochę podobnego,
alias
ale nieco skomplikowanego: wybierz Bash / shW każdym razie należy spróbować obu stron, aby zorientować się, do czego są zdolni.
Być może odpowiedź można rozszerzyć o pakiety i punkty wsparcia IDE, ale nie znam tych stron.
Jak zwykle do wyboru jest kanapka z łajnem i olbrzymi natrysk. I pamiętaj, jeszcze kilka lat temu Perl był nową nadzieją. Gdzie to jest teraz.
źródło
Pod względem wydajności bash przewyższa Pythona w czasie uruchamiania procesu.
Oto kilka pomiarów z mojego laptopa Core i7 z systemem 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
* Biblioteki ładowane w Pythonie to: os, os.path, json, time, request, threading, subprocess
Pokazuje to ogromną różnicę, jednak czas wykonania basha szybko się zmniejsza, jeśli musi zrobić coś rozsądnego, ponieważ zwykle musi wywoływać procesy zewnętrzne.
Jeśli zależy Ci na wydajności, używaj basha tylko do:
źródło
/bin/echo
przewyższa bash o taką wielkość, że trudno to zmierzyć. Więc zamiast uruchamiać bash, możesz użyć/bin/echo mycommand > named_pipe
(wyślij polecenia / komunikaty do nazwanego potoku lub gniazda) ... i mieć w tle proces Pythona odczytujący polecenia / instrukcje z tego potoku i uruchamiający je. Więc bash nie jest dobrą „optymalizacją kosztów początkowych”.Bash to przede wszystkim język skryptowy wsadowy / powłoki, który obsługuje znacznie mniej różnych typów danych i wszelkiego rodzaju dziwactwa wokół struktur kontrolnych - nie wspominając o problemach ze zgodnością.
Który jest szybszy? Ani też, ponieważ nie porównujesz tutaj jabłek z jabłkami. Gdybyś musiał posortować plik tekstowy ascii i używałeś narzędzi takich jak zcat, sort, uniq i sed, to spalisz Pythona pod względem wydajności.
Jeśli jednak potrzebujesz odpowiedniego środowiska programistycznego, które obsługuje zmiennoprzecinkowe i różne przepływy sterowania, to Python wygrywa. Jeśli napisałeś, powiedzmy, algorytm rekurencyjny w Bash i Pythonie, wersja Pythona wygra w rzędzie wielkości lub więcej.
źródło
Jeśli chcesz połączyć szybkie narzędzie przy minimalnym wysiłku, bash jest dobry. W przypadku opakowania do aplikacji bash jest nieoceniony.
Wszystko, co może sprawić, że będziesz wracać w kółko w celu dodania ulepszeń, prawdopodobnie (choć nie zawsze) lepiej pasuje do języka takiego jak Python, ponieważ kod Bash zawierający ponad 1000 linii jest bardzo trudny w utrzymaniu. Kod Bash również irytuje debugowanie, gdy robi się długi .......
Część problemu z tego rodzaju pytaniami wynika z mojego doświadczenia, że skrypty powłoki są zwykle zadaniami niestandardowymi. Było bardzo mało zadań związanych ze skryptami powłoki, z którymi się spotkałem, w przypadku których istnieje już dostępne bezpłatnie rozwiązanie.
źródło
Są 2 scenariusze, w których wydajność Bash jest co najmniej równa, jak sądzę:
To powiedziawszy, zazwyczaj nie przejmuję się wydajnością samego języka skryptowego. Jeśli wydajność jest poważnym problemem, nie wykonujesz skryptów, ale programujesz (prawdopodobnie w Pythonie).
źródło
Piszę tę późną odpowiedź głównie dlatego, że Google lubi to pytanie.
Uważam, że problem i kontekst naprawdę powinny dotyczyć przepływu pracy, a nie narzędzi. Ogólna filozofia zawsze brzmi: „Używaj właściwego narzędzia do pracy”. Ale zanim to nastąpi, wielu często zapomina, kiedy gubią się w narzędziach: „Wykonaj zadanie”.
Kiedy mam problem, który nie jest do końca zdefiniowany, prawie zawsze zaczynam od Basha. Rozwiązałem kilka trudnych problemów w dużych skryptach Bash, które są zarówno czytelne, jak i możliwe do utrzymania.
Ale kiedy problem zaczyna przekraczać to, o co należy poprosić Basha? Mam kilka czeków, których używam, aby ostrzegać mnie:
I tak dalej. Podsumowując, kiedy ciężej pracujesz, aby utrzymać uruchomione skrypty, dodając funkcje, czas opuścić Bash.
Załóżmy, że zdecydowałeś się przenieść swoją pracę do Pythona. Jeśli twoje skrypty Bash są czyste, początkowa konwersja jest dość prosta. Jest nawet kilku konwerterów / tłumaczy, którzy wykonają za Ciebie pierwszy przebieg.
Następne pytanie brzmi: Czego rezygnujesz z przejścia na Python?
Wszystkie wywołania zewnętrznych narzędzi muszą być opakowane w coś z
subprocess
modułu (lub odpowiednika). Można to zrobić na wiele sposobów, a do wersji 3.7 trzeba było trochę wysiłku, aby to zrobić dobrze (wersja 3.7 została ulepszona,subprocess.run()
aby samodzielnie obsługiwać wszystkie typowe przypadki).Co zaskakujące, Python nie ma żadnego standardowego, niezależnego od platformy narzędzia nieblokującego (z limitem czasu) do odpytywania klawiatury (stdin). Polecenie Bash
read
to niesamowite narzędzie do prostej interakcji z użytkownikiem. Moim najczęstszym zastosowaniem jest wyświetlanie pokrętła, dopóki użytkownik nie naciśnie klawisza, jednocześnie uruchamiając funkcję odpytywania (z każdym krokiem pokrętła), aby upewnić się, że wszystko działa dobrze. Jest to trudniejszy problem, niż mogłoby się wydawać na początku, więc często po prostu dzwonię do Bash: Drogi, ale robi dokładnie to, czego potrzebuję.Jeśli programujesz w systemie osadzonym lub z ograniczoną pamięcią, zużycie pamięci w Pythonie może być wielokrotnie większe niż w Bash (w zależności od wykonywanego zadania). Ponadto prawie zawsze w pamięci jest już wystąpienie Bash, co może nie mieć miejsca w przypadku Pythona.
W przypadku skryptów, które działają raz i szybko się zamykają, czas uruchamiania Pythona może być znacznie dłuższy niż Bash. Ale jeśli skrypt zawiera znaczące obliczenia, Python szybko idzie do przodu.
Python ma najbardziej wszechstronny system pakietów na świecie. Kiedy Bash staje się nawet nieco skomplikowany, Python prawdopodobnie ma pakiet, który sprawia, że całe fragmenty Bash stają się pojedynczym wywołaniem. Jednak znalezienie odpowiedniego pakietu (pakietów) do użycia jest największą i najbardziej zniechęcającą częścią zostania Pythonistą. Na szczęście Google i StackExchange to Twoi przyjaciele.
źródło
Nie wiem, czy to jest dokładne, ale odkryłem, że Python / Ruby działa znacznie lepiej w przypadku skryptów, które mają dużo obliczeń matematycznych. W przeciwnym razie musisz użyć
dc
lub innego "kalkulatora z dowolną dokładnością". To po prostu staje się bardzo dużym bólem. W Pythonie masz znacznie większą kontrolę nad liczbami zmiennoprzecinkowymi w porównaniu z intami i znacznie łatwiej jest wykonać wiele obliczeń, a czasami.W szczególności nigdy nie pracowałbym ze skryptem bash do obsługi informacji binarnych lub bajtów. Zamiast tego użyłbym czegoś takiego jak python (być może) lub C ++ lub nawet Node.JS.
źródło
Jeśli chodzi o wydajność, oba mogą robić to samo, więc pojawia się pytanie, które oszczędza więcej czasu na rozwój?
Bash polega na wywoływaniu innych poleceń i przekazywaniu ich do tworzenia nowych. Ma to tę zaletę, że można szybko tworzyć nowe programy, używając tylko kodu pożyczonego od innych osób, niezależnie od używanego przez nich języka programowania.
Ma to również efekt uboczny polegający na dość dobrym oporze przed zmianą poleceń podrzędnych, ponieważ interfejs między nimi to zwykły tekst.
Dodatkowo Bash jest bardzo liberalny, jeśli chodzi o to, jak można na nim pisać. Oznacza to, że będzie działać dobrze w szerszej gamie kontekstów, ale opiera się również na zamiarze programisty, który ma zamiar kodować w czysty i bezpieczny sposób. W przeciwnym razie Bash nie powstrzyma Cię przed budowaniem bałaganu.
Python jest bardziej zbudowany pod względem stylu, więc niechlujny programista nie będzie tak bałaganiarski. Będzie również działać w systemach operacyjnych poza Linuksem, dzięki czemu będzie od razu bardziej odpowiedni, jeśli potrzebujesz tego rodzaju przenośności.
Ale wywoływanie innych poleceń nie jest tak proste. Więc jeśli twój system operacyjny to Unix, najprawdopodobniej okaże się, że programowanie w Bash jest najszybszym sposobem na rozwój.
Kiedy używać Bash:
Kiedy używać Pythona:
źródło