[python] Modifikace seznamu bez kopirovnani (bylo SQLite - forma selectovaných dat)
superman
feed na centrum.cz
Pondělí Leden 8 12:37:09 CET 2007
> Pokud by však platila teze, že čtení prvku seznamu pomocí indexu je pro
> velké seznamy pomalé, tak by varianta s enumerate mohla být rychlejší.
> Důvodem je to, že získává další hodnotu načtením následujícího prvku v
> seznamu (rychlá operace) namísto pomalého přístupu přes index.
> Test však ukázal, že uvedená tese neplatí, takže pythovský list() asi není
> obyčejný obousměrně svázaný seznam.
A není ani důvod aby byl. Každý trochu zkušený programátor by určitě
list neimplementoval vnitřně jako obousměrně vázaný seznam, protože tím
získá prakticky jenom nevýhody.
O vnitřní implementaci list napovídá to, že Python má tuple a list, tedy
dva objekty dělající de facto to samé (pomiňte teď konstantnost tuple) a
tipnul bych si tedy že spíše jde o to, že list alokuje paměť pro indexy
dopředu, a že se jedná o obyčejné pole s empiricky vyladěnými algoritmy
pro minimální počet alokací a trochu plýtvající pamětí, zatímco tuple
bude vnitřně to samé co list, akorát alokuje paměť na indexy přesně.
Jinak už jen úvaha, že přístup přes index je pomalejší, než cokoli
jiného je úchylná, protože si fakt neumím představit, že by někdo
implementoval pole (tj. něco s neměnnou lineární řadou celočíselných
indexů) tak, aby přístup přes indexy nebyl superrychlý. Zvlášť když
přístup k poli přes index je suverénně nejčastěji vyžadovaná operace v
programu a tím pádem je logické, že je implmentována s ohledem na
maximální rychlost.
Ing. Miloslav Ponkrác
Další informace o konferenci Python