Beste antwoord
Om hash-typen in Python te begrijpen, moet je begrijpen wat hashing is en waarom het wordt gebruikt. Dus hier is een kort overzicht van hashing:
Als je een object hashen, betekent dit in feite dat je het door een of andere functie laat lopen. Deze functie wordt een hash-functie genoemd. Wat deze hash-functie doet, is je een unieke output geven voor een unieke input. Laten we bijvoorbeeld zeggen dat we een hash-functie hebben die hash heet en twee variabelen a en b zodat a! = B, en dan hash (a)! = Hash (b). In theorie toch. In de praktijk voer je uit in een hash-botsing. Dat betekent a! = B maar hash (a) == hash (b). Een voorbeeld zou zijn als uw hash-functie x mod 10 is, dan hash (12) == hash (2). Er zijn een paar manieren om hiermee om te gaan.
Python gebruikt dit voor het opslaan van sleutels in woordenboeken. De manier waarop ze dit doen, is dat ze het object hashen, de hash vervolgens toewijzen aan een index in een array en de waarde daar plaatsen. Laten we bijvoorbeeld zeggen dat u “123” wilt opslaan bij toets “abc”. Laten we zeggen dat python een array voor een woordenboek heeft geïnitialiseerd naar 10. Wat python zal doen is hash (abc) en vervolgens mod het met 10 om het in een woordenboek te plaatsen. Laten we zeggen dat hash (abc) 1234 retourneert. Python mods dat vervolgens met 10 om er 4 te krijgen. Vervolgens wordt 123 in index 4 geplaatst.
Dus eigenlijk is een hash-type slechts een type dat kan worden gehasht. Je kunt een functie-hash maken door \_\_hash\_\_ en \_\_eq\_\_ in python te overschrijven. Maar je moet er voor zorgen dat de hash hetzelfde teruggeeft elke keer dat het hetzelfde object krijgt. Als je bijvoorbeeld \_\_hash\_\_ een willekeurig getal laat retourneren elke keer dat je het belt, zul je je object nooit meer in een hashable vinden. Tegelijkertijd wil je niet voor elk object hetzelfde retourneren, want dan krijg je veel false positives.
Natuurlijk is dit wat ingewikkelder en dit is een extreem kort overzicht, maar dit is de basis achter hashing
Antwoord
Dit is een moeilijke vraag (maar een goede). In Amerikaans Engels kan de vraag worden gelezen als ‘lijst alle dingen op die de Python-taal niet kan’. Dat is moeilijk (voor mij) omdat ik niet genoeg weet om ze allemaal op te noemen. Hieronder heb ik enkele dingen opgesomd die Python niet kan. Lees alle andere antwoorden voor meer informatie.
- Python werkt niet voor apparaatstuurprogrammas. Apparaatstuurprogrammas moeten supersnel en uiterst responsief zijn. Python is dat meestal ook niet. Device-drivers moeten standalone draaien. Python heeft een groot runtime-systeem. Python gebruikt een garbage collection-systeem dat enigszins lijkt op Java. In sommige gevallen zijn pauzes voor garbage collection ondraaglijk.
- Python kan op sommige heel kleine computers niet worden gebruikt. Sommige computers (zoals Arduino in het algemeen) zijn gewoon te klein voor Python. Python heeft een runtime-bibliotheek die voor sommige machines te veel geheugen in beslag neemt. Er is iets dat MicroPython heet. Maar zelfs MicroPython gebruikt veel meer geheugen dan sommige (zeer kleine) systemen. Merk op dat de Raspberry Pi op Python is gebaseerd.
- Python werkt niet echt in de browser. Er zijn tools en oplossingen voor dit probleem. JavaScript is echter (verreweg) de dominante tool voor front-end programmeren, niet Python.
- Python is niet zo draagbaar. Eigenlijk is Python super draagbaar. U moet echter de Python-runtime al hebben geïnstalleerd. Als gevolg hiervan zijn de meeste games niet in Python geschreven. Het installeren van de Python-run-time is voor veel applicaties gewoon een te groot obstakel. In dit opzicht lijkt Python veel op Java. Java is eigenlijk heel erg draagbaar. U moet echter al een JVM hebben geïnstalleerd.
- Python is te traag voor sommige toepassingen. Games hebben zeer veeleisende FPS-vereisten en moeten enorme aantallen pixels verwerken. Als gevolg hiervan zijn de meeste games geschreven in C / C ++, niet in Python. Python is gemiddeld ongeveer 100 keer langzamer dan C ++. In veel (de meeste gevallen) gevallen is dat niet zon groot probleem. Voor games en sommige andere toepassingen wel.
- Python is niet echt een ‘bare metal’ taal. Als u rechtstreeks toegang moet krijgen tot hardware en deze moet manipuleren, is Python misschien geen goede keuze. Zie punt 1 (apparaatstuurprogrammas) hierboven. Merk op dat Python geen echte verwijzingen heeft met daadwerkelijke machine-adressen erin. Dit is in sommige gevallen een kritiek probleem.
- Python is vrijwel single-threaded (zie de andere antwoorden). Dit is in sommige gevallen een groot probleem (eigenlijk niet veel) en in andere gevallen geen probleem. Merk op dat Python niet bijzonder goed werkt bij het gebruik van traditionele kernen. Sommige zeer belangrijke Python-bibliotheken maken echter gebruik van CUDA-kernen.
Over het algemeen is Python een redelijk goede tool. Persoonlijk vind ik het geweldig. Het is echter niet voor alles de juiste keuze.