Co to są typy hashable w Pythonie?


Najlepsza odpowiedź

Aby zrozumieć typy hashable w Pythonie, musisz zrozumieć, czym jest haszowanie i dlaczego jest używane. Oto krótkie omówienie haszowania:

Kiedy haszujesz obiekt, naprawdę oznacza to, że wykonujesz go za pomocą jakiejś funkcji. Ta funkcja jest nazywana funkcją skrótu. To, co robi ta funkcja skrótu, to unikalne wyjście dla unikalnego wejścia. Na przykład, powiedzmy, że mamy funkcję skrótu o nazwie hash oraz dwie zmienne a i b takie, że a! = B, a następnie hash (a)! = Hash (b). Teoretycznie i tak. W praktyce będziesz działać w kolizję hash. To oznacza a! = B, ale hash (a) == hash (b). Przykładem może być, jeśli twoja funkcja skrótu to x mod 10, a następnie hash (12) == hash (2). Jest na to kilka sposobów.

Python używa tego do przechowywania kluczy w słownikach. Sposób, w jaki to robią, polega na tym, że haszują obiekt, a następnie mapują skrót do indeksu w tablicy, a następnie umieszczają tam wartość. Na przykład, powiedzmy, że chcesz zapisać „123” pod klawiszem „abc”. Powiedzmy, że python zainicjował tablicę dla słownika na 10. To, co zrobi Python to hash („abc”), a następnie mod o 10, aby umieścić go w słowniku. Powiedzmy, że hash (abc) zwraca 1234. Python następnie modyfikuje to o 10, aby uzyskać 4. Następnie wstawia „123” do indeksu 4.

Więc w zasadzie typ, który można mieszać, to po prostu typ, który można zaszyfrować. Możesz uczynić funkcję hashowaną przez nadpisanie \_\_hash\_\_ i \_\_eq\_\_ w pythonie. Ale musisz być ostrożny, aby upewnić się, że hash zwraca to samo za każdym razem, gdy otrzymuje ten sam obiekt. Na przykład, jeśli zmienisz \_\_hash\_\_ zwróci liczbę losową za każdym razem, gdy to nazwiesz, już nigdy nie znajdziesz swojego obiektu w hashable. Jednocześnie nie chcesz zwracać tego samego dla każdego obiektu, ponieważ wtedy otrzymasz wiele fałszywych alarmów.

Oczywiście jest to nieco bardziej skomplikowane i jest to niezwykle krótki przegląd, ale to są podstawy haszowania

Odpowiedź

To jest trudne pytanie (ale dobre). W amerykańskim angielskim pytanie to można odczytać jako „wymień wszystkie rzeczy, których język Python nie potrafi”. To jest trudne (dla mnie), ponieważ nie znam ich na tyle, żeby je wszystkie wymienić. Poniżej wymieniłem niektóre rzeczy, których Python nie może zrobić. Przeczytaj wszystkie pozostałe odpowiedzi, aby uzyskać więcej informacji.

  1. Python nie działa w przypadku sterowników urządzeń. Sterowniki urządzeń muszą być superszybkie i wyjątkowo responsywne. Python też nie jest. Sterowniki urządzeń muszą działać samodzielnie. Python ma duży system wykonawczy. Python używa systemu czyszczenia pamięci, podobnego do Java. W niektórych przypadkach przerwy w usuwaniu elementów bezużytecznych są niedopuszczalne.
  2. Pythona nie można używać na niektórych naprawdę małych komputerach. Niektóre komputery (takie jak ogólnie Arduino) są po prostu za małe dla Pythona. Python ma bibliotekę wykonawczą, która zajmuje zbyt dużo pamięci dla niektórych maszyn. Jest coś, co nazywa się MicroPython. Jednak nawet MicroPython zużywa znacznie więcej pamięci niż niektóre (bardzo małe) systemy. Zwróć uwagę, że Raspberry Pi jest oparty na Pythonie.
  3. Python tak naprawdę nie działa w przeglądarce. Istnieją narzędzia i rozwiązania tego problemu. Jednak JavaScript jest (jak dotąd) dominującym narzędziem do programowania front-end, a nie Python.
  4. Python nie jest tak przenośny. W rzeczywistości Python jest super przenośny. Jednak musisz mieć już zainstalowane środowisko wykonawcze języka Python. W rezultacie większość gier nie jest napisana w języku Python. Instalacja środowiska wykonawczego Pythona jest po prostu zbyt dużą przeszkodą dla wielu aplikacji. Pod tym względem Python bardzo przypomina Javę. Java jest w rzeczywistości bardzo, bardzo przenośna. Jednak musisz mieć już zainstalowaną maszynę JVM.
  5. Python jest zbyt wolny do niektórych zastosowań. Gry mają bardzo wysokie wymagania dotyczące FPS i muszą przetwarzać ogromną liczbę pikseli. W rezultacie większość gier jest napisana w C / C ++, a nie w Pythonie. Średnio Python jest około 100 razy wolniejszy niż C ++. W wielu (właściwie) przypadkach nie stanowi to większego problemu. W przypadku gier i niektórych innych aplikacji tak jest.
  6. Python nie jest językiem „czystego metalu”. Jeśli potrzebujesz bezpośredniego dostępu do sprzętu i manipulowania nim, Python może nie być dobrym wyborem. Zobacz punkt 1 (sterowniki urządzeń) powyżej. Zauważ, że Python nie ma prawdziwych wskaźników z rzeczywistymi adresami maszyn. W niektórych przypadkach jest to krytyczny problem.
  7. Python jest prawie jednowątkowy (zobacz inne odpowiedzi). W niektórych przypadkach jest to duży problem (tak naprawdę niewielu), aw innych nie. Zauważ, że Python nie radzi sobie szczególnie dobrze z wykorzystaniem tradycyjnych rdzeni. Jednak niektóre bardzo ważne biblioteki Pythona wykorzystują rdzenie CUDA.

Ogólnie Python jest całkiem dobrym narzędziem. Osobiście to uwielbiam. Jednak nie jest to właściwy wybór do wszystkiego.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *