Migliore risposta
Per comprendere i tipi hashable in Python, è necessario capire cosè lhashing e perché viene utilizzato. Quindi ecco una breve panoramica dellhashing:
Quando si esegue lhashing di un oggetto, significa che lo si sta eseguendo tramite una funzione. Questa funzione è chiamata funzione hash. Ciò che fa questa funzione hash è fornire un output univoco per un input univoco. Ad esempio, diciamo che abbiamo una funzione hash chiamata hash e due variabili aeb tali che a! = B, quindi hash (a)! = Hash (b). In teoria comunque. In pratica eseguirai in una collisione di hash. Ciò significa a! = B ma hash (a) == hash (b). Un esempio potrebbe essere se la tua funzione hash è x mod 10, quindi hash (12) == hash (2). Ci sono alcuni modi per gestirlo.
Python lo usa per memorizzare le chiavi nei dizionari. Il modo in cui lo fanno è sottoporre a hash loggetto, quindi associare lhash a un indice in un array e quindi inserire il valore lì. Quindi, per esempio, diciamo che vuoi memorizzare “123” nel tasto “abc”. Diciamo che python ha inizializzato un array per un dizionario a 10. Quello che python farà è hash (abc) e poi mod per 10 per metterlo in un dizionario. Diciamo che hash (abc) restituisce 1234. Python quindi lo modifica per 10 per ottenere 4. Quindi inserisce “123” nellindice 4.
Quindi fondamentalmente un tipo hashable è solo un tipo che può essere sottoposto a hashing. Puoi rendere hash una funzione sovrascrivendo \_\_hash\_\_ e \_\_eq\_\_ in python. Ma devi assicurarti che lhash restituisca la stessa cosa ogni volta che ottiene lo stesso oggetto. Ad esempio, se fai \_\_hash\_\_ restituisce un numero casuale ogni volta che lo chiami, non troverai mai più il tuo oggetto in un hashable. Allo stesso tempo non vuoi restituire la stessa cosa per ogni oggetto, perché in tal caso otterrai molti falsi positivi.
Ovviamente questo è un po più complicato e questo è estremamente breve panoramica ma questa è la base dietro lhashing
Risposta
Questa è una domanda difficile (ma buona). In inglese americano, la domanda può essere letta come “elenca tutte le cose che il linguaggio Python non può fare”. È difficile (per me) perché non ne so abbastanza per elencarli tutti. Di seguito ho elencato alcune delle cose che Python non può fare. Leggi tutte le altre risposte per maggiori informazioni.
- Python non funziona per i driver di dispositivo. I driver di dispositivo devono essere super veloci e ultra reattivi. Python non tende ad esserlo neanche. I driver di dispositivo devono essere eseguiti autonomamente. Python ha un ampio sistema di runtime. Python utilizza un sistema di raccolta dei rifiuti un po come Java. In alcuni casi, le pause per la garbage collection sono intollerabili.
- Python non può essere utilizzato su alcuni computer molto piccoli. Alcuni computer (come Arduino in generale) sono troppo piccoli per Python. Python ha una libreria di runtime che richiede troppa memoria per alcune macchine. Cè qualcosa chiamato MicroPython. Tuttavia, anche MicroPython utilizza molta più memoria rispetto ad alcuni sistemi (molto piccoli). Tieni presente che Raspberry Pi è basato su Python.
- Python non viene eseguito nel browser. Esistono strumenti e soluzioni per questo problema. Tuttavia, JavaScript è (di gran lunga) lo strumento dominante per la programmazione front-end, non Python.
- Python non è così portabile. In realtà, Python è superportatile. Tuttavia, è necessario che il runtime di Python sia già installato. Di conseguenza, la maggior parte dei giochi non sono scritti in Python. Linstallazione del run-time di Python è un ostacolo troppo grande per molte applicazioni. Sotto questo aspetto, Python è molto simile a Java. Java è in realtà molto, molto portabile. Tuttavia, devi avere una JVM già installata.
- Python è troppo lento per alcuni usi. I giochi hanno requisiti FPS molto esigenti e devono elaborare un gran numero di pixel. Di conseguenza, la maggior parte dei giochi sono scritti in C / C ++, non in Python. In media, Python è circa 100 volte più lento di C ++. In molti (quasi tutti) i casi, questo non è un grosso problema. Per i giochi e alcune altre applicazioni, lo è.
- Python non è un linguaggio “bare metal”. Se è necessario accedere e manipolare direttamente lhardware, Python potrebbe non essere una buona scelta. Vedere il punto 1 (driver di dispositivo) sopra. Si noti che Python non ha veri puntatori con indirizzi macchina reali in essi. Questo è un problema critico in alcuni casi.
- Python è praticamente a thread singolo (vedi le altre risposte). Questo è un grosso problema in alcuni casi (non molti in realtà) e un non problema in altri. Nota che Python non fa un lavoro particolarmente buono nellusare i core tradizionali. Tuttavia, alcune librerie Python molto importanti sfruttano i core CUDA.
Nel complesso, Python è uno strumento piuttosto buono. Personalmente, lo adoro. Tuttavia, non è la scelta giusta per tutto.