Checking for an "undefined" variable - newbie question
Duncan Booth
duncan at NOSPAMrcp.co.uk
Wed Aug 6 10:19:48 EDT 2003
Alex Martelli <aleax at aleax.it> wrote in
news:XL5Ya.40525$cl3.1301474 at news2.tin.it:
> This is the canonical solution. Personally, I find it quite nice
> that an ugly architecture (such as one based on whether a variable
> is already defined/initialized rather than initializing it at the
> start with a unique value and testing for that!) requires an ugly
> way of expressing it. Unfortunately there are nicer ones such as
> "if 'variable' not in locals() and 'variable' not in globals():" but
> at least they're verbose and slow:-).
How slow the nicer forms are kind of depends whether or not you expect the
variable to exist. The canonical solution is very fast if the variable
exists and the exception isn't thrown, but if the exception is thrown it
sucks:
>timeit.py "try:" " variable" "except NameError: pass"
100000 loops, best of 3: 11.3 usec per loop
>timeit.py -s "global variable" -s "variable=0" "try:" " variable"
"except NameError: pass"
1000000 loops, best of 3: 0.374 usec per loop
Testing for membership of globals() is pretty fast whether or not the
variable exists:
>lib\timeit.py "if 'variable' not in globals(): pass"
1000000 loops, best of 3: 0.576 usec per loop
>lib\timeit.py -s "global variable" -s "variable=0" "if 'variable' not in
globals(): pass"
1000000 loops, best of 3: 0.636 usec per loop
Testing for membership of locals() or vars() is slower than globals() (as
you would expect), but if the variable doesn't exist it still beats the
exception block by a long way:
>lib\timeit.py "if 'variable' not in vars(): pass"
1000000 loops, best of 3: 1.44 usec per loop
>lib\timeit.py -s "variable=0" "if 'variable' not in vars(): pass"
1000000 loops, best of 3: 1.75 usec per loop
However, I must say that I agree fully with the point that Alex was really
making (albeit somewhat obliquely). You shouldn't normally have to do this
kind of thing at all.
--
Duncan Booth duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
More information about the Python-list
mailing list