Should I use "if" or "try" (as a matter of speed)?
Peter Hansen
peter at engcorp.com
Sat Jul 9 17:42:28 EDT 2005
Thomas Lotze wrote:
> Steve Juranich wrote:
>>What do I mean by "cheaper"? I'm basically talking about the number of
>>instructions that are necessary to set up and execute a try block as
>>opposed to an if block.
>
> I don't know about the implementation of exceptions but I suspect most
> of what try does doesn't happen at run-time at all, and things get
> checked and looked for only if an exception did occur. An I suspect that
> it's machine code that does that checking and looking, not byte code.
> (Please correct me if I'm wrong, anyone with more insight.)
Part right, part confusing. Definitely "try" is something that happens
at run-time, not compile time, at least in the sense of the execution of
the corresponding byte code. At compile time nothing much happens
except a determination of where to jump if an exception is actually
raised in the try block.
Try corresponds to a single bytecode SETUP_EXCEPT, so from the point of
view of Python code it is extremely fast, especially compared to
something like a function call (which some if-tests would do). (There
are also corresponding POP_BLOCK and JUMP_FORWARD instructions at the
end of the try block, and they're even faster, though the corresponding
if-test version would similarly have a jump of some kind involved.)
Exceptions in Python are checked for all the time, so there's little you
can do to avoid part of the cost of that. There is a small additional
cost (in the C code) when the exceptional condition is actually present,
of course, with some resulting work to create the Exception object and
raise it.
Some analysis of this can be done trivially by anyone with a working
interpreter, using the "dis" module.
def f():
try:
func()
except:
print 'ni!'
import dis
dis.dis(f)
Each line of the output represents a single bytecode instruction plus
operands, similar to an assembly code disassembly.
To go further, get the Python source and skim through the ceval.c
module, or do that via CVS
http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Python/ceval.c?rev=2.424&view=auto
, looking for the string "main loop".
And, in any case, remember that readability is almost always more
important than optimization, and you should consider first whether one
or the other approach is clearly more expressive (for future
programmers, including yourself) in the specific case involved.
-Peter
More information about the Python-list
mailing list