[python] from modul import *

Radek Kanovsky rk na dat.cz
Pátek Červenec 5 12:01:52 CEST 2002


On Fri, Jul 05, 2002 at 08:14:10AM +0200, ViNiL wrote:

> On Fri, Jul 05, 2002 at 02:44:52AM +0200, Petr Vanek wrote:
> > zdravim,
> > 
> > ve vsech howto se nedoporucuje importovat * from modul, nebot
> > to promicha karty jmen promenny v namespace (pekne receno ;-). navic se
> > mi zda (a i jsem to nekde cetl), ze to zpomali start programu, nebot se
> > nacte i to, co neni potrebne.
> > 
> > pouzivam wxPython GUI a zkusil jsem namisto from wxPython.wx import * 
> > pouzit from wxPython.wx import wx, ale casove to vychazi na stejno (mam
> > slaby pocitac, tak vim, o cem mluvim - zhruba o osmi vterinach
> > natahovani modulu wxPython). problemy se jmeny  promennych v v
> > namespaces mne tolik netrapi, ma pro mne smysl se trapit se specifikaci
> > konkretnich importovanych veci, kdyz mi to nic neprinasi?
> 
> Cele to zalezi na tom, jak je ten modul napsany.
> 
> Vubec nejlepsi je v importu 'from' nepouzivat, ale uznavam, ze nekdy by to byl
> vopruz.
> 
> To, ze importovani konkretnich veci ti nic neprinasi, neni pravda. Prave onen
> name clash zjistis obvykle az po dni hledani :-) Krome toho je to vyrazne
> hezci.

Rozhodne se nedoporucuje pouzivat konstrukci ``from mod import *''
v modulech, o kterych se predpoklada, ze je budou pouzivat dalsi
lidi/moduly. Pokud pisu uz nejaky finalni program, o kterem se
predpoklada, ze nebude nikdy importovany, tak si myslim, ze je
to jedno.

> Ta rychlost se neprojevi anitak pri samotnem importu (predpokladam, ze ten
> modul mas zbytecompilovany), jako pri behu tveho programu. Je logicke, ze cim
> "bohatsi" namespace, tim vic rezie navic (v podstate pri kazdem hledani (t.j.
> pouziti) napr. promenne). A vzhledem k tomu, ze onim "from blabla import *"
> importujes take importovane moduly, neni to jaksi ono...

Co se tyce te rychlosi, tak to mne neni moc jasne, ale zadne poradne
testy jsem nedelal. Podle meho badani to ale zavisi na situaci:

Varianta-1
------------------------------------------
from xml.dom.minidom import *

def vratNode () :
	return Node
------------------------------------------

Kazdy odkaz na Node z modulu xml.dom.minidom generuje nasledujici bytecode:

          6 LOAD_GLOBAL              0 (Node)

Generuje teda pouze jednu instrukci, ktera vyhleda klic Node
v asciativnim poli globalnich promennych. Ikdyz toto pole muze
byt vetsi, nez pri pouziti druhe varianty, myslim si, ze to bude
rychlejsi, ale spotrebuje to vetsinou vice pameti.

Varianta-2
------------------------------------------
import xml.dom.minidom

def vratNode () :
	return xml.dom.minidom.Node
------------------------------------------

V tomto pripade odkaz na xml.dom.minidom.Node generuje nasledujici bytecode:

          6 LOAD_GLOBAL              0 (xml)
          9 LOAD_ATTR                1 (dom)
         12 LOAD_ATTR                2 (minidom)
         15 LOAD_ATTR                3 (Node)

Evidentne se tu vykonava vic kodu. Pokud nenaroste pole globalnich
promennych pouzitim 'from cosi import *' zasadnim zpusobem, bude tohle
asi vzdy pomalejsi. Spotrebuje se ovsem mene pameti (vetsinou).

Ja osobne pouzivam v pripade, ze nechci porad dokola psat
modul.sub1.sub2.Neco kostrukci:

import modul.sub1.sub2 as zkrakta

Pak se na modul.sub1.sub2.Neco odkazuju jako na zkratka.Neco.
Ve starsim pythonu ``as'' nefunguje, ale lze docilit stejneho efektu
pouzitim:

import modul.sub1.sub2
zkratka = modul.sub1.sub2


Zdravi

Radek Kaňovský


Další informace o konferenci Python