Python wydaje się teraz wściekły i nie bez powodu - ponieważ jest to naprawdę język, którym prawie się cieszy, gdy dostaje się nowy problem do rozwiązania. Ale, jak powiedział kiedyś mądry człowiek (nazywając go mędrcem tylko dlatego, że nie mam pojęcia, kto to powiedział; nie jestem pewien, czy on był w ogóle taki mądry), aby naprawdę znać język, którego nie tylko się zna składnia, design itp., zalety, ale także jego wady. Żaden język nie jest idealny, niektóre są po prostu lepsze niż inne.
Jakie byłyby Twoim zdaniem obiektywne wady Pythona.
Uwaga: nie pytam o porównanie języków (tj. C # jest lepszy niż Python, ponieważ ... yadda yadda yadda) - bardziej obiektywna (do pewnego stopnia) opinia, które funkcje językowe są źle zaprojektowane, czy to, co może niektórych brakuje w nim i tak dalej. Jeśli trzeba użyć innego języka jako porównania, ale tylko w celu zilustrowania kwestii, która w innym przypadku byłaby trudna do opracowania (tj. Dla ułatwienia zrozumienia)
źródło
Odpowiedzi:
Używam Pythona dość regularnie i ogólnie uważam, że jest to bardzo dobry język. Niemniej jednak żaden język nie jest idealny. Oto wady w kolejności według mnie osobiście:
Jest wolny Mam na myśli naprawdę, bardzo powoli. Wiele razy to nie ma znaczenia, ale zdecydowanie oznacza, że będziesz potrzebować innego języka dla bitów o kluczowym znaczeniu dla wydajności.
Funkcje zagnieżdżone w pewnym sensie zasysają to, że nie można modyfikować zmiennych w zakresie zewnętrznym. Edycja: Nadal używam Pythona 2 ze względu na obsługę bibliotek, a ten błąd w projekcie denerwuje mnie, ale najwyraźniej został naprawiony w Pythonie 3 z powodu nielokalnej instrukcji. Nie mogę się doczekać, aż biblioteki, których używam, zostaną przeniesione, aby ten błąd mógł zostać przesłany na stos popiołów historii na dobre.
Brakuje kilku funkcji, które mogą być przydatne do biblioteki / kodu generycznego, a IMHO upraszcza ekstremalne niezdrowe sytuacje. Najważniejsze, jakie mogę wymyślić, to typy wartości zdefiniowane przez użytkownika (domyślam się, że można je tworzyć za pomocą magii metaklasy, ale nigdy nie próbowałem) i parametr funkcji ref.
To daleko od metalu. Potrzebujesz pisać operacje na wątkach, kod jądra czy coś takiego? Powodzenia.
Chociaż nie przeszkadza mi brak możliwości wychwytywania błędów semantycznych z góry jako kompromis dla dynamizmu, który oferuje Python, chciałbym, aby istniał sposób na wychwycenie błędów składniowych i głupich rzeczy, takich jak błędne wpisywanie nazw zmiennych bez konieczności uruchamiania kodu.
Dokumentacja nie jest tak dobra, jak języki takie jak PHP i Java, które mają silne zaplecze korporacyjne.
źródło
with
instrukcję lub metody nalist
. Wszystko, co obejmuje samouczek, jest w zasadzie niemożliwe do przeszukania. Mam dużo więcej szczęścia z dokumentacją Microsoftu dla C ++.Nienawidzę tego, że Python nie potrafi rozróżnić deklaracji od użycia zmiennej. Aby to zrobić, nie potrzebujesz pisania statycznego. Byłoby po prostu miło powiedzieć „jest to zmienna, którą celowo deklaruję i zamierzam wprowadzić nową nazwę, to nie jest literówka”.
Ponadto zwykle używam zmiennych Python w stylu jednokrotnego zapisu, to znaczy traktuję zmienne jako niezmienne i nie modyfikuję ich po pierwszym przypisaniu. Dzięki takim funkcjom, jak przetwarzanie list, jest to niezwykle łatwe i ułatwia śledzenie przepływu kodu.
Nie mogę jednak udokumentować tego faktu. Nic w Pythonie nie uniemożliwia mi nadpisywania lub ponownego wykorzystywania zmiennych.
Podsumowując, chciałbym mieć dwa słowa kluczowe w języku:
var
ilet
. Jeśli piszę do zmiennej niezadeklarowanej przez żadną z nich, Python powinien zgłosić błąd. Ponadtolet
deklaruje zmienne jako tylko do odczytu, podczas gdyvar
zmienne są „normalne”.Rozważ ten przykład:
Zauważ, że typy są nadal niejawne (ale
let
zmienne są statycznie typowane dla wszystkich celów i celów, ponieważ nie można ich przywrócić do nowej wartości, podczas gdyvar
zmienne mogą być nadal dynamicznie typowane).Wreszcie wszystkie argumenty metody powinny być automatycznie
let
, tzn. Powinny być tylko do odczytu. Zasadniczo nie ma żadnego powodu, aby modyfikować parametr, z wyjątkiem następującego idiomu:Można to zastąpić nieco innym idiomem:
źródło
use strict;
iuse warnings;
perl na skrypcie dowolnej wielkości. Python pozbawił programistę zbyt wielu pomocy do debugowania.var
ilet
(lub podobny mechanizm) jest wadą. Innymi słowy: gdybym był projektantem Pythona, zrobiłbym coś takiego. To powiedziawszy , przyszłe wersje mogą to obejmować, gdy załadujesz specjalny pakiet (podobny do__future__
). Powiedziećimport strict
. Tak się jednak nie stanie, ponieważ wymaga hacków składniowych…Moja główna skarga dotyczy wątków, które w wielu okolicznościach nie są tak wydajne (w porównaniu z Javą, C i innymi) z powodu globalnej blokady interpretera (patrz „Wewnątrz Python GIL” (link PDF) )
Istnieje jednak interfejs wieloprocesowy, który jest bardzo łatwy w użyciu, jednak korzystanie z pamięci dla tej samej liczby procesów w porównaniu do wątków będzie większe, lub trudne, jeśli masz dużo wspólnych danych. Korzyścią jest jednak to, że gdy program działa z wieloma procesami, może być skalowany na wielu komputerach, czego nie może zrobić program wielowątkowy.
Naprawdę nie zgadzam się z krytyką dokumentacji, uważam, że jest ona doskonała i lepsza niż większość, jeśli nie wszystkie główne języki.
Ponadto możesz złapać wiele błędów środowiska uruchomieniowego, uruchamiając pylint .
źródło
Prawdopodobnie brak pisania statycznego, który może wprowadzić pewne klasy błędów w czasie wykonywania , nie jest wart dodatkowej elastyczności, jaką zapewnia pisanie kaczką.
źródło
int foo = 4; Console.Write(foo.Length);
nie kompiluje się, więc błąd „Int32 nie ma właściwości Długość” nie może przypadkowo dostać się do opublikowanego oprogramowania. W Pythonie, chyba że uruchomisz opcjonalne narzędzia pomocnicze w celu wyszukania takich błędów, kod, który uzyskuje dostęp do nieistniejących elementów obiektów, może pozostać niewykryty, dopóki nie spowoduje to błędów w czasie wykonywania.Wydaje mi się, że zorientowane obiektowo części Pythona są jakby „przykręcone”. Cała potrzeba jawnego przekazania „siebie” każdej metodzie jest symptomem tego, że jej składnik OOP nie został wyraźnie zaplanowany , można powiedzieć; pokazuje także czasami brudzące zasady określania zakresu Pythona, które zostały skrytykowane w innej odpowiedzi.
Edytować:
Kiedy mówię, że zorientowane obiektowo części Pythona wydają się „przykręcone”, mam na myśli to, że czasami strona OOP wydaje się niespójna. Weźmy na przykład Ruby: w Ruby wszystko jest obiektem, a ty wywołujesz metodę przy użyciu znanej
obj.method
składni (oczywiście z wyjątkiem przeciążonych operatorów); w Pythonie wszystko też jest obiektem, ale niektóre metody wywołuje się jako funkcję; tzn. przeciążasz,__len__
aby zwrócić długość, ale wywołujesz ją, używająclen(obj)
bardziej znanego (i spójnego)obj.length
wspólnego w innych językach. Wiem, że istnieją powody tej decyzji projektowej, ale ich nie lubię.Ponadto w modelu OOP Pythona brakuje jakiejkolwiek ochrony danych, tzn. Nie ma prywatnych, chronionych i publicznych członków; możesz je naśladować za pomocą metod
_
i__
przed nimi, ale to trochę brzydkie. Podobnie, Python nie do końca rozumie aspekt OOP w zakresie przekazywania wiadomości.źródło
Czego nie lubię w Pythonie:
lambda
może zawierać tylko jedno wyrażenie).cin
czyscanf
w C ++ i C lubScanner
Java).źródło
raw_input
i 'sys.stdin' są dość gołe. Nie obsługują pobierania sformatowanych danych wejściowych (np. „% D:% d:% d”% (godzina, minuta, sekunda) do odczytu w czasie). Jak dotąd Python nie ma nic wspólnego z funkcjonalnością scanf (w C) lub Scanner (Java).Domyślne argumenty ze zmiennymi typami danych.
Zwykle jest to wynikiem pewnych subtelnych błędów. Myślę, że byłoby lepiej, gdyby tworzył nowy obiekt listy za każdym razem, gdy wymagany był domyślny argument (zamiast tworzyć pojedynczy obiekt do użycia dla każdego wywołania funkcji).
Edycja: To nie jest duży problem, ale kiedy coś trzeba odwołać w dokumentacji, zwykle oznacza to, że jest to problem. Nie powinno to być wymagane.
Zwłaszcza gdy powinno to być ustawienie domyślne. To po prostu dziwne zachowanie, które nie odpowiada oczekiwaniom i nie jest przydatne w wielu okolicznościach.
źródło
Niektóre funkcje Pythona, które czynią go tak elastycznym jak język programowania, są również postrzegane jako główne wady tych, które są wykorzystywane do analizy statycznej „całego programu” przeprowadzanej przez proces kompilacji i łączenia w językach takich jak C ++ i Java.
Zmienne lokalne są deklarowane za pomocą zwykłej instrukcji przypisania. Oznacza to, że powiązania zmiennych w dowolnym innym zakresie wymagają od kompilatora jawnej adnotacji (globalne i nielokalne deklaracje dla zakresów zewnętrznych, notacja dostępu do atrybutów na przykład dla zakresów). To znacznie zmniejsza ilość płyty kotłowej potrzebnej przy programowaniu, ale oznacza, że do przeprowadzania kontroli obsługiwanych przez kompilator w językach wymagających wyraźnych deklaracji zmiennych potrzebne są narzędzia do analizy statycznej innych firm (takie jak płatki py).
Zawartość modułów, obiektów klasy, a nawet wbudowanej przestrzeni nazw można modyfikować w czasie wykonywania. Jest to niezwykle potężny, umożliwiający wiele niezwykle przydatnych technik. Jednak ta elastyczność oznacza, że Python nie oferuje niektórych funkcji wspólnych dla statycznych języków OO. W szczególności parametr „self” dla metod instancji jest raczej jawny niż niejawny (ponieważ „metod” nie trzeba definiować wewnątrz klasy, można je później dodać poprzez modyfikację klasy, co oznacza, że nie jest to szczególnie praktyczne niejawnie przekazać odwołanie do instancji) i kontroli dostępu do atrybutu nie można łatwo egzekwować w zależności od tego, czy kod znajduje się „wewnątrz”, czy „poza” klasą (ponieważ to rozróżnienie istnieje tylko podczas wykonywania definicji klasy).
Dotyczy to również wielu innych języków wysokiego poziomu, ale Python ma tendencję do wyabstrahowywania większości szczegółów sprzętowych. Języki programowania systemów, takie jak C i C ++, są nadal znacznie lepiej przystosowane do obsługi bezpośredniego dostępu do sprzętu (jednak Python z przyjemnością porozmawia z tymi za pomocą modułów rozszerzeń CPython lub, bardziej przenośnie, za pośrednictwem
ctypes
biblioteki).źródło
Przykład zepsutego określania zakresu; transkrypcja z sesji tłumacza:
global
inonlocal
wprowadzono słowa kluczowe, aby załatać tę głupotę projektu.źródło
global
lubnonlocal
w Pythonie. Tak rzadko, że zapominam, że ten problem istnieje i muszę go ponownie wyszukać w Google, gdy pojawia się kilka razy, mimo że piszę kod Python codziennie w pracy. Dla mnie kod, który musi modyfikować zmienne globalne (lub, co gorsza, zewnętrzne zmienne nieglobalne) jest zapachem kodu. Zwykle jest (nie zawsze) lepszy sposób.Uważam, że kombinacja składni obiektowej
this.method()
imethod(this)
składni proceduralnej / funkcjonalnej Pythona jest bardzo niepokojąca:Jest to szczególnie złe, ponieważ duża liczba funkcji (a nie metod) jest po prostu zrzucana do globalnej przestrzeni nazw : metody odnoszące się do list, ciągów, liczb, konstruktorów, metaprogramowania, wszystkie zmieszane w jedną dużą listę posortowaną alfabetycznie.
Przynajmniej w językach funkcjonalnych, takich jak F #, wszystkie funkcje mają odpowiednio rozmieszczone nazwy w modułach:
Więc nie wszyscy są razem. Co więcej, jest to standard przestrzegany w całej bibliotece, więc przynajmniej jest spójny.
Rozumiem powody, dla których warto wykonać funkcję vs metoda , ale nadal uważam, że złym pomysłem jest mieszanie ich w ten sposób. Byłbym znacznie szczęśliwszy, gdyby przestrzegano składni metody, przynajmniej w przypadku typowych operacji:
Niezależnie od tego, czy metody mutują, czy nie, posiadanie ich jako metod na obiekcie ma kilka zalet:
Module
kiedy dzwoniszModule.method(x)
. Biorąc powyższy przykładowy wykaz funkcji, dlaczego muszę ciągle powtarzaćList
? Powinien wiedzieć, że jest toList
i nie chcę wywoływać tejNavigation.map()
funkcji! Korzystanie zex.map()
składni powoduje, że jest ona SUCHA i nadal jednoznaczna.I oczywiście ma to zalety w porównaniu z metodą umieszczania wszystkiego w globalnej przestrzeni nazw . To nie jest tak, że obecny sposób nie jest w stanie zrobić rzeczy. Jest to nawet dość terse (
len(lst)
), ponieważ nic nie ma przestrzeni nazw! Rozumiem zalety korzystania z funkcji (zachowanie domyślne itp.) W stosunku do metod, ale nadal mi się to nie podoba.To jest po prostu bałagan. A w dużych projektach bałagan jest twoim największym wrogiem.
źródło
len()
jest funkcją i jakie są zalety. Stwierdziłem także, dlaczego uważam, że to zły pomysł, dlaczego uważam, że funkcje globalne są szczególnie złym pomysłem i dlaczego uważam, że metody zapewniają wygodną metodę organizowania i określania zakresu twojej funkcjonalności =)def
,class
i inne połączenia non-funkcyjne. Porównaj to z ponad 100 w większości innych popularnych języków. Należy także rozważyć linię zimport this
:Namespaces are one honking great idea -- let's do more of those!
. Myślę, że możesz źle zrozumieć przestrzenie nazw Python;)Brak homoikoniczności .
Python musiał poczekać, aż 3.x doda słowo kluczowe „z”. W każdym języku homoikonicznym można go trywialnie dodać do biblioteki.
Większość innych problemów, które widziałem w odpowiedziach, należą do jednego z 3 rodzajów:
1) Rzeczy, które można naprawić za pomocą oprzyrządowania (np. Płatki pyłu) 2) Szczegóły implementacji (GIL, wydajność) 3) Rzeczy, które można naprawić za pomocą standardów kodowania (tj. Cechy, których ludzie nie chcieliby, aby ich nie było)
# 2 nie jest problemem z językiem, IMO # 1 i # 3 nie są poważnymi problemami.
źródło
with
był dostępny z Pythona 2.5from __future__ import with_statement
, ale zgadzam się, czasami okazało się, że niefortunne jest to, że instrukcje takie jakif
/for
/print
/ etc są „specjalne” zamiast zwykłych funkcjiPython jest moim ulubionym językiem, ponieważ jest bardzo ekspresyjny, ale wciąż powstrzymuje cię od popełniania zbyt wielu błędów. Nadal mam kilka rzeczy, które mnie denerwują:
Brak prawdziwych anonimowych funkcji. Lambda może być używana do funkcji pojedynczej instrukcji, a
with
instrukcja może być używana do wielu rzeczy, w których użyjesz bloku kodu w Rubim. Ale w niektórych sytuacjach sprawia, że rzeczy są nieco bardziej niezgrabne, niż musiałyby być. (Daleko od tak niezdarnego, jak by to było w Javie, ale nadal ...)Pewne zamieszanie w relacji między modułami i plikami. Uruchamianie „python foo.py” z wiersza poleceń różni się od „import foo”. Względny import w Pythonie 2.x może również powodować problemy. Mimo to moduły Pythona są o wiele lepsze niż odpowiednie funkcje C, C ++ i Ruby.
Jawne
self
. Mimo że rozumiem niektóre z tego przyczyn i chociaż codziennie używam Pythona, często popełniam błąd, zapominając o tym. Innym problemem jest to, że tworzenie klasy z modułu staje się nieco nudne. Jawne ja wiąże się z ograniczonym zasięgiem, na który narzekali inni. Najmniejszy zakres w Pythonie to zakres funkcji. Jeśli utrzymujesz swoje funkcje na małym poziomie, tak jak powinieneś, nie jest to problem sam w sobie, a IMO często daje czystszy kod.Niektóre funkcje globalne, takie jak
len
, że można oczekiwać, że będzie to metoda (która faktycznie jest za kulisami).Znaczące wcięcie. Nie sam pomysł, który moim zdaniem jest świetny, ale ponieważ jest to jedyna rzecz, która powstrzymuje tylu ludzi przed wypróbowaniem Pythona, być może lepiej byłoby dla Pythona z niektórymi (opcjonalnymi) symbolami początku / końca. Ignorując tych ludzi, mógłbym całkowicie żyć z wymuszonym rozmiarem wcięcia.
Że nie jest to wbudowany język przeglądarek internetowych, a nie JavaScript.
Spośród tych skarg to tylko pierwsza, na tyle mi zależy, że myślę, że należy ją dodać do języka. Inne są raczej niewielkie, z wyjątkiem ostatniego, co byłoby wspaniałe, gdyby tak się stało!
źródło
datetime.datetime.now()
kiedy jeden projekt mógłby napisać,datetime.now
a następnie pomieszanie dwóch projektów w jeden sposób wyklucza drugi i na pewno nie zdarzyłoby się to w Javie, która nie nazwałaby modułu tak samo jak plik (?) Jeśli widzisz, jak często zdarza się, że moduł myli nas z plikiem, gdy oba zastosowania są praktykowane i jawneself
, wciąż próbuję zrozumieć, ponieważ wywołania nie mają takiej samej liczby argumentów jak funkcje. I możesz pomyśleć, że python VM jest wolny?Python nie jest w pełni dojrzały: język Python 3.2 ma w tej chwili problemy ze zgodnością z większością obecnie dystrybuowanych pakietów (zazwyczaj są one kompatybilne z Pythonem 2.5). Jest to duża wada, która obecnie wymaga większego wysiłku programistycznego (znajdź potrzebny pakiet, sprawdź kompatybilność; zważ, wybierając niezbyt dobry pakiet, który może być bardziej kompatybilny; weź najlepszą wersję, zaktualizuj ją do wersji 3.2, co może zająć kilka dni; następnie zacznij robić coś pożytecznego).
Prawdopodobnie w połowie 2012 roku będzie to mniej mankamentem.
Zauważ, że chyba zostałem oceniony przez jednego z fanów-fanów. Podczas dyskusji programistów nasz zespół programistów wysokiego szczebla doszedł jednak do tego samego wniosku.
Dojrzałość w jednym głównym znaczeniu oznacza, że zespół może korzystać z tej technologii i bardzo szybko działać bez ukrytych zagrożeń (w tym problemów ze zgodnością). Pakiety Python innych firm i wiele aplikacji nie działa w wersji 3.2 dla większości dzisiejszych pakietów. Powoduje to więcej pracy związanej z integracją, testowaniem, ponownym wdrażaniem samej technologii zamiast rozwiązywania danego problemu == mniej dojrzałej technologii.
Aktualizacja z czerwca 2013 r .: Python 3 nadal ma problemy z dojrzałością. Co jakiś czas członek zespołu wspomina o potrzebnym pakiecie, a następnie mówi „z wyjątkiem tylko wersji 2.6” (w niektórych przypadkach wdrożyłem obejście za pośrednictwem gniazda localhost, aby używać pakietu tylko w wersji 2.6 z wersją 2.6 i resztą nasze narzędzia pozostają w wersji 3.2). Nawet MoinMoin, wiki o czystym pythonie, nie jest napisane w Pythonie 3.
źródło
Zakres Pythona jest poważnie uszkodzony, co sprawia, że programowanie obiektowe w Pythonie jest bardzo niewygodne.
źródło
self.
przed każdym odwołaniem do właściwości i metody wystąpienia. Uniemożliwia użycie Pythona do tworzenia DSL, tak jak to jest tak łatwe w Ruby.Moje obawy dotyczące Pythona:
źródło
Modyfikatory dostępu w Pythonie nie są egzekwowalne - utrudnia pisanie dobrze ustrukturyzowanego, zmodularyzowanego kodu.
Przypuszczam, że jest to część zepsutego ustalania zasięgu @ Masona - ogólnie duży problem z tym językiem. W przypadku kodu, który powinien być czytelny, wydaje się dość trudne do określenia, co może i powinno być w zakresie i jaką wartość będzie w danym momencie - obecnie myślę o przejściu z języka Python z powodu tych wad .
To, że „wszyscy zgadzamy się na dorosłych” nie oznacza, że nie popełniamy błędów i nie pracujemy lepiej w ramach silnej struktury, szczególnie podczas pracy nad złożonymi projektami - wcięcia i bezsensowne podkreślenia nie wydają się wystarczające .
źródło
Ale ma kilka wspaniałych funkcji odkupienia:
źródło
Jestem zwolennikiem Pythona, a pierwszą wadą, która przychodzi mi na myśl, jest to, że komentując takie zdanie
if myTest():
, musisz zmienić wcięcie całego wykonanego bloku, którego nie musiałbyś robić w C lub Javie. W rzeczywistości w pythonie zamiast komentowania klauzuli if zamiast tego zacząłem komentować w ten sposób: `if True: #myTest (), więc nie będę musiał zmieniać następującego bloku kodu. Ponieważ Java i C nie polegają na wcięciach, komentowanie instrukcji jest łatwiejsze w C i Javie.źródło
if something()
naif False and something()
. Inną sztuczką jest „komentowanie” przy użyciu ciągu wieloliniowego.Wysyłka wielokrotna nie integruje się dobrze z ustalonym systemem pojedynczej wysyłki i nie jest bardzo wydajna.
Ładowanie dynamiczne jest ogromnym problemem w równoległych systemach plików, w których semantyka podobna do POSIX prowadzi do katastrofalnych spowolnień w operacjach intensywnie wykorzystujących metadane. Mam kolegów, którzy spalili ćwierć miliona godzin pracy po prostu ładując Pythona (z numpy, mpi4py, petsc4py i innymi modułami rozszerzeń) na rdzeniach 65k. (Symulacja przyniosła znaczące nowe wyniki naukowe, więc było warto, ale jest to problem, gdy pali się więcej niż baryłkę ropy, aby załadować Pythona raz.) Brak możliwości statycznego połączenia zmusił nas do podjęcia wielkich skręceń, aby uzyskać rozsądne czasy ładowania w skali, w tym łatanie libc-rtld, aby umożliwić dostęp do
dlopen
zbiorowego systemu plików.źródło
dlopen
Rzeczy jest w naszym collfs bibliotece. To repozytorium zawiera także dodatkowe sztuczki zipimport inspirowane buforowaniem ścieżki przez Ashera Langtona. Pracujemy nad lepszą dystrybucją i dokumentem.W każdym razie python jest moim głównym językiem od 4 lat. Bycie fanboyem, elitą lub monomanią nie jest częścią kultury pytona.
źródło
len(s)
poprzez__len__(self)
i inne „metody specjalne”__add__
oraz__iadd__
dla+
i+=
)self
jako pierwszy parametr metodyźródło
„Niezmienność” nie jest dokładnie jego mocną stroną. Liczby, krotki i łańcuchy AFAIK są niezmienne, wszystko inne (tj. Obiekty) można modyfikować. Porównaj to z funkcjonalnymi językami, takimi jak Erlang lub Haskell, w których wszystko jest niezmienne (przynajmniej domyślnie).
Jednak niezmienność naprawdę świeci dzięki współbieżności *, która również nie jest mocną stroną Pythona, więc przynajmniej jest konsekwencją.
(* = Dla nitpickerów: mam na myśli współbieżność, która jest przynajmniej częściowo równoległa. Wydaje mi się, że Python jest w porządku z współbieżnością „jednowątkową”, w której niezmienność nie jest tak ważna. (Tak, miłośnicy FP, wiem, że niezmienność jest świetnie nawet bez współbieżności.))
źródło
Chciałbym mieć wyraźnie równoległe konstrukcje. Częściej niż nie, kiedy piszę listę ze zrozumieniem
Nie obchodzi mnie kolejność, w jakiej elementy będą przetwarzane. Czasami nawet mnie nie obchodzi, w jakiej kolejności są zwracane.
Nawet jeśli CPython nie może zrobić tego dobrze, gdy mój f jest czystym Pythonem, takie zachowanie można zdefiniować dla innych implementacji.
źródło
Python nie ma optymalizacji wywołania ogona, głównie z powodów filozoficznych . Oznacza to, że rekurencja na dużych strukturach może kosztować pamięć O (n) (z powodu niepotrzebnego stosu, który jest utrzymywany) i będzie wymagać przepisania rekurencji jako pętli w celu uzyskania pamięci O (1).
źródło