Hvad er hashable-typer i Python?


Bedste svar

For at forstå hashable-typer i python skal du forstå, hvad hashing er, og hvorfor det bruges. Så her er en kort oversigt over hashing:

Når du hash et objekt betyder det virkelig, at du kører det gennem en eller anden funktion. Denne funktion kaldes en hash-funktion. Hvad denne hash-funktion gør, er at give dig et unikt output til et unikt input. Lad os f.eks. Sige, at vi har en hash-funktion kaldet hash og to variabler a og b, således at a! = B, så hash (a)! = Hash (b). I teorien alligevel. I praksis vil du køre ind i en hash-kollision. Det betyder a! = B men hash (a) == hash (b). Et eksempel ville være, hvis din hash-funktion er x mod 10, så hash (12) == hash (2). Der er et par måder at håndtere dette på.

Python bruger dette til opbevaring af nøgler i ordbøger. Den måde, de gør dette på, er at de hash objektet, kortlægger hashen til et indeks i en matrix og derefter placerer værdien der. Lad os for eksempel sige, at du vil gemme “123” ved nøglen “abc”. Lad os sige, at python initialiserede et array til en ordbog til 10. Hvad python vil gøre er hash (abc) og derefter mod det med 10 for at sætte det i en ordbog. Lad os sige hash (abc) returnerer 1234. Python modificerer derefter det med 10 for at få 4. Det sætter derefter “123” i indeks 4.

Så dybest set er en hashable-type bare en type, der kan hashes. Du kan gøre en funktion hashable ved at overskrive \_\_hash\_\_ og \_\_eq\_\_ i python. Men du skal være forsigtig med at sikre, at hash returnerer det samme hver gang det får det samme objekt. For eksempel hvis du laver \_\_hash\_\_ returnerer et tilfældigt tal hver gang du kalder det, finder du aldrig dit objekt i en hash igen. Samtidig vil du ikke returnere den samme ting for hvert objekt, for så får du en masse falske positive.

Dette er selvfølgelig lidt mere kompliceret, og dette er en ekstremt kort oversigt, men dette er det grundlæggende bag hashing

Svar

Dette er et svært spørgsmål (men et godt spørgsmål). På amerikansk engelsk kan spørgsmålet læses som anfør alle de ting, som Python-sproget ikke kan gøre. Det er svært (for mig), fordi jeg ikke vidste nok til at liste dem alle. Nedenfor har jeg listet nogle af de ting, Python ikke kan gøre. Læs alle de andre svar for at få flere oplysninger.

  1. Python fungerer ikke for enhedsdrivere. Enhedsdrivere skal være superhurtige og ultraresponsive. Python har heller ikke tendens til at være det. Enhedsdrivere skal køre uafhængige. Python har et stort run-time-system. Python bruger et skraldopsamlingssystem noget ligesom Java. I nogle tilfælde er pauser til affaldsindsamling utålelige.
  2. Python kan ikke bruges på nogle virkelig små computere. Nogle computere (som Arduino generelt) er bare for små til Python. Python har et runtime-bibliotek, der tager for meget hukommelse til nogle maskiner. Der er noget, der hedder MicroPython. Selv MicroPython bruger dog meget mere hukommelse end nogle (meget små) systemer har. Bemærk, at Raspberry Pi er Python-baseret.
  3. Python kører ikke rigtig i browseren. Der findes værktøjer og løsninger til dette problem. JavaScript er dog (langt) det dominerende værktøj til frontend-programmering, ikke Python.
  4. Python er ikke så bærbar. Faktisk er Python super-bærbar. Du skal dog have Python-kørselstiden allerede installeret. Som en konsekvens er de fleste spil ikke skrevet i Python. Installation af Python-kørselstiden er bare for meget af en hindring for mange applikationer. I denne henseende ligner Python meget Java. Java er faktisk meget, meget bærbart. Du skal dog have en JVM allerede installeret.
  5. Python er for langsom til nogle anvendelser. Spil har meget krævende FPS-krav og har brug for at behandle et stort antal pixels. Som en konsekvens er de fleste spil skrevet i C / C ++, ikke Python. I gennemsnit er Python cirka 100 gange langsommere end C ++. I mange (faktisk) tilfælde er det ikke meget af et problem. For spil og nogle andre applikationer er det.
  6. Python er ikke meget af et bare metal sprog. Hvis du har brug for direkte adgang til og manipulering af hardware, er Python muligvis ikke et godt valg. Se punkt 1 (enhedsdrivere) ovenfor. Bemærk, at Python ikke har ægte markører med faktiske maskinadresser i dem. Dette er i nogle tilfælde et kritisk problem.
  7. Python er stort set enkelt-trådet (se de andre svar). Dette er et stort problem i nogle tilfælde (ikke mange virkelig) og et ikke-problem i andre. Bemærk, at Python ikke gør et særligt godt stykke arbejde med at bruge traditionelle kerner. Nogle meget vigtige Python-biblioteker udnytter dog CUDA-kerner.

Samlet set er Python et ret godt værktøj. Personligt elsker jeg det. Det er dog ikke det rigtige valg til alt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *