[python] cyklus for (bylo superman: zaporny systemovy cas)
Petr Prikryl
PrikrylP na skil.cz
Středa Listopad 29 11:47:32 CET 2006
superman
> > Pokud jakákoliv konstrukce větvení nebo cyklu
> > neprovádí testy a jiné příkazy způsobem, který
> > by mohl mít za následek vedlejší efekt, a pokud
> > je tělo takové konstrukce prázdné, dá se úplně
> > vynechat.
>
> Pokud testy volají funkci, pak jste s optimalizací
> skončil. A for cyklus v Pythonu je veden tímto
> směrem, dokonce range má v budoucnu vracet
> iterátor, tedy funkci.
Pokud ta funkce nemá vedlejší efekt (což jsem zmínil)
pak ji ani nemusím volat, abych mohl celou konstrukci
vypustit. A můžu to udělat právě optimalizací v AST,
tedy jakoby na úrovni přeparsovaného zdrojového
textu. Problém je, jak zjistit, že ta funkce nemá
vedlejší efekt.
Iterátor není funkce. Je to objekt. A jeho metoda
next() typicky nemá vedlejší efekt (pokud si ho
tam někdo sám nenaprogramuje).
Trošku horší je to s generátory, protože vecpat
tam vedlejší efekt (třeba print)... udělat tuhle
chybu můžeme jaksi přirozenějším způsobem ;o)
> > Ani v jazycích C/C++ neexistuje klasický cyklus
> > for. A co je to vůbec klasický cyklus for?
> > Ten co zavedl (nebo převzal) Pascal?
> > Pro objektový přístup, který využívá různé
> > typy kontejnerů (nejen pole) je průchod přes
> > indexy příliš speciální.
>
> Python, který i pro cyklus přes lineární číselnou
> řadu musí vytvářet sekvenci, nebo iterátor je jen
> překážkou pro optimalizaci. Samozřejmě to jde
> optimalizovat, ale je potřeba vědět speciální
> objekty a sekvence a vidět dovnitř, tedy je to
> špinavý přístup.
Konstrukce cyklu je navržena především pro
programátory, nikoliv pro jakýkoliv optimalizátor.
Z tohoto pohledu se ptám ještě jednou. Co to je
"klasický cyklus"? Je jeho speciálnost pro programátora
natolik důležitá, aby opodstatnila současnou
existenci konstrukcí for/foreach? A v jakých
jazycích se takový "klasický for" vlastně
používá?
pepr
Další informace o konferenci Python