On Wed, Oct 24, 2012 at 3:24 PM, Alan Gauld <alan.ga...@btinternet.com> wrote: > On 24/10/12 18:49, eryksun wrote: > >> Using "in ['25', '26']" also checks a compiled tuple constant: >> >> >>> compile("x in ['25', '26']", '', 'eval').co_consts >> ('25', '26', ('25', '26')) >> >> 3.x adds frozenset support: >> >> >>> compile("x in {'25', '26'}", '', 'eval').co_consts >> ('25', '26', frozenset({'25', '26'})) > > > I confess I don't know what that means! > And if I don't I doubt if the OP will either. > Can you explain the above in English please?
Sorry, I was showing that the compiler (at least for CPython) special cases "in" and "not in" comparisons when the right-hand operand is a list literal of constants. Instead of going to the trouble of building a list every time the code runs, it uses a tuple that's stored in the code object's co_consts attribute. In Python 3, this optimization was extended to set literals constants. I guess I should show that in more detail by disassembling a function instead of manually compiling code. First in Python 2.7.3: >>> def func(x): ... return x in {1, 2, 3} >>> dis.dis(func) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 1 (1) 6 LOAD_CONST 2 (2) 9 LOAD_CONST 3 (3) 12 BUILD_SET 3 15 COMPARE_OP 6 (in) 18 RETURN_VALUE Each time the function is called it has to build a set (BUILD_SET) from the constants 1, 2, and 3. Compare that to Python 3.2.3: >>> dis.dis(func) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 4 (frozenset({1, 2, 3})) 6 COMPARE_OP 6 (in) 9 RETURN_VALUE Here the compiler stored a frozenset in the code object. So it only has to load the frozenset on the stack instead of building a new set each time the function is called. compile: http://docs.python.org/py3k/library/functions.html#compile frozenset: http://docs.python.org/py3k/library/functions.html#func-frozenset code objects: http://docs.python.org/py3k/reference/datamodel.html#index-51 The optimization is in peephole.c, PyCode_Optimize/tuple_of_constants: http://hg.python.org/cpython/file/3d0686d90f55/Python/peephole.c#l469 http://hg.python.org/cpython/file/3d0686d90f55/Python/peephole.c#l25 _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor