Python slots tuple

Det er selvfolgelig noen forskjeller mellom tuples og lister, men i dag oppdaget jeg en subtil og interessant en: tuples har en null-__itemsize__, og lister gjor det ikke. Eller for a si det pa en mer forstaelig mate, i CPython er tupler variabler i storrelse og lister er ikke.

Vent, hva? Lister er tydelig variabel storrelse ting, faktisk mer variabel storrelse som tuples siden en tuple er uforanderlig en gang opprettet. Det viser seg at forskjellen er noyaktig hvorfor tuples er variabel storrelse blobs og lister er ikke.

Bade lister og tupler ma lagre en rekke storrelser av et eller annet sted. Som dekket i HowSlotsWorkI, tillater CPython runtime den grunnleggende lagringsplassen for en Python-objekt-instans for a fa en variabel mengde tilleggsdata pa slutten. Du kan imidlertid ikke endre storrelsen pa en forekomstblomst nar den er opprettet. Fordi tupler er uforanderlige, endres storrelsen pa elementarrangementet ikke nar en tuple-forekomst er opprettet, og de kan direkte lagre deres elementarray pa slutten av deres C-niva-blob, og lagrer en separat minneallokering og en peker. Men lister kan og endrer storrelsen pa elementelementet deres etter opprettelsen, og ma derfor lagre deres elementarray i en separat del av lagringsplass, slik at de fritt kan endre storrelsen pa det som den aktuelle listen vokser og krymper.

En av konsekvensene av dette er den tradisjonelle: Du kan ikke subclass tuple med alt som har en ikke-tom __slots__.

(I teorien gjor det at tuples er litt mer hukommelseseffektive enn lister. I praksis er forskjellene sma nok til at de ikke er sannsynlige, med mindre du har et stort antall elementer.)

PS: Som du kanskje forventer, er dikt en annen variabel storrelse Python ting som har en null __itemsize__.

Dette er en del av CSpace, og er skrevet av ChrisSiebenmann.

Denne dinky wiki blir hentet til deg av Insane Hackers Guild, Python sub-branch.