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 -- http://mail.python.org/mailman/listinfo/python-list