On Wed, 05 Dec 2012 16:46:39 +0100, Bruno Dupuis wrote: > Hi, > > I'm interested in compilers optimizations, so I study python compilation > process > > I ran that script: > > import timeit > > def f(x): > return None > > def g(x): > return None > print(x) > > number = 10000 > > print(timeit.timeit('f(1)',setup="from __main__ import f", > number=number)) print(timeit.timeit('g(1)',setup="from __main__ > import g", number=number)) > > print(dis.dis(f)) > print(dis.dis(g)) > > It gives this output: > > 0.003460251959040761 > 0.004164454061537981 > 17 0 LOAD_CONST 0 (None) > 3 RETURN_VALUE > None > 20 0 LOAD_GLOBAL 0 (None) > 3 RETURN_VALUE > > 21 4 LOAD_GLOBAL 1 (print) > 7 LOAD_FAST 0 (x) > 10 CALL_FUNCTION 1 (1 positional, 0 keyword > pair) 13 POP_TOP > None > > I do not understand why the dead code `print(x)` takes time (~20% in > that case). As we see in the opcode, a call to g(1) returns immediately, > so there should be no delay at all. Where am i wrong?
The difference is almost certain between the LOAD_CONST and the LOAD_GLOBAL. As to *why* there is such a difference, I believe that's a leftover from early Python days when None was not a keyword and could be reassigned. [steve@ando ~]$ python1.5 Python 1.5.2 (#1, Aug 27 2012, 09:09:18) [GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> from dis import dis >>> >>> def h(): ... x = 1 ... return None ... >>> dis(h) 0 SET_LINENO 1 3 SET_LINENO 2 6 LOAD_CONST 1 (1) 9 STORE_FAST 0 (x) 12 SET_LINENO 3 15 LOAD_GLOBAL 1 (None) 18 RETURN_VALUE 19 LOAD_CONST 0 (None) 22 RETURN_VALUE >>> None = 42 >>> h() 42 Now that None is a keyword, it should always be a LOAD_CONST. -- Steven -- http://mail.python.org/mailman/listinfo/python-list