Hello, Le Tue, 24 Nov 2009 14:41:19 +0100, mk a écrit : > > As Rob pointed out (thanks): > > 11 31 LOAD_FAST 0 (nonevar) > 34 JUMP_IF_FALSE 4 (to 41) > > I'm no good at py compiler or implementation internals and so I have no > idea what bytecode "JUMP_IF_FALSE" is actually doing.
It tries to evaluate the op of the stack (here nonevar) in a boolean context (which theoretically involves calling __nonzero__ on the type) and then jumps if the result is False (rather than True). You are totally right that it does /more/ than "is not None", but since it is executed as a single opcode rather than a sequence of several opcodes, the additional work it has to do is compensated (in this case) by the smaller overhead in bytecode interpretation. As someone pointed out, the Python interpreter could grow CISC-like opcodes so as to collapse "is not None" (or generically "is not <constant>") into a single JUMP_IF_IS_NOT_CONST opcode. Actually, it is the kind of optimizations wpython does (http://code.google.com/p/ wpython/). Regards Antoine. -- http://mail.python.org/mailman/listinfo/python-list