[python] SQLite - forma selectovaných dat

radek py.cz na svarz.cz
Pondělí Leden 8 01:39:43 CET 2007


> > JInak, proc pouzivate for i in range(len(a)): ? Uz jsem si toho
> > vsimnul driv, u jinych prispevku. Preci, kdyz chci iterovat pres
> > prvky, tak musi staci for item in a:
>
> 1) Zvyk z jiných jazyků.



Ano, to mi prislo jako nejpadnejsi duvod. Cloveka to tihne delat veci,
jak je zvykly :) Nic ve zlem, ja si taky v sobe taham vzory z 6502
assembleru.


>
> 2) Protože taková iterace je read only. Já můžu dát for item in a, ale
> už nezměním ten konkrétní prvek přímo v poli. Třeba jako v tomto případě
> výsledné pole má stejný počet prvků, jen tuple se má změnit na seznam.
> Vycházím z toho (možná mylně), že cokoli jiného, než iterace přes indexy
> lze zařídit jedině tak, že budu mít v paměti dvě pole, první budu číst
> iterací, do druhé budu vytvářet výsledek. Zatímco při iteraci přes
> indexy mám jen jedno pole, nad kterým se čte i zapisuje - je to paměťově
> efektivnější.
>
> Existuje možnost jak to udělat bez indexování a bez toho, aby v paměti
> byly dočasně dvě pole?


Zalezi na tom, co optimalizujete. Ja posledni dobou radeji preferuji
"optimalizaci" citelnosti kodu a az v pripade potreby optimalizaci
naroku na pamet, nebo rychlost.

Ve Vasem priklade si myslim, ze dany objekt z pole nezmenite na typ
list, ale ze vlastne vytvorite novy, pricemz stary zustane v pameti,
dokud ho garbage collector nezahodi. A to postupne pro vsechny prvky
pole. Akorat to bude pomalejsi a mene citelne.

Pouziti built-in funkce map je pry rychlejsi - zajimava rozprava o
optimalizaci je tady: http://www.python.org/doc/essays/list2str.html

No, v kazdem pripade ta otazka je na miste treba pro nejake pole
integeru, nad kterym se dela operace, jejiz vysledek je zase integer o
stejne byte velikosti (treba deleni dvema?).

A samozrejme neco jineho je, pokud ten index iterace potrebujeme
(napr. pro print).
Radek


Další informace o konferenci Python