Why Is Local Variable Access Faster Than Class Member Access In Python?
While trying to tackle a more complex problem, I came to compare access speed to local variable vs member variables. Here a test program: #!/usr/bin/env python MAX=40000000 class
Solution 1:
self.m += 1
means you have to look up a local variable called self
and then find the attribute called m
Of course if you just have to look up a local variable, it will be faster without the extra step.
It can be useful to look at what is happening under the hood:
>>> import dis
>>> dis.dis(StressTestLocal.do_work)
180 LOAD_CONST 1 (0)
3 STORE_FAST 1 (m)
196 LOAD_FAST 1 (m)
9 LOAD_CONST 2 (1)
12 INPLACE_ADD
13 STORE_FAST 1 (m)
2016 LOAD_FAST 1 (m)
19 LOAD_CONST 3 (2)
22 INPLACE_MULTIPLY
23 STORE_FAST 1 (m)
26 LOAD_CONST 0 (None)
29 RETURN_VALUE
>>> dis.dis(StressTestMember.do_work)
100 LOAD_FAST 0 (self)
3 DUP_TOP
4 LOAD_ATTR 0 (m)
7 LOAD_CONST 1 (1)
10 INPLACE_ADD
11 ROT_TWO
12 STORE_ATTR 0 (m)
1115 LOAD_FAST 0 (self)
18 DUP_TOP
19 LOAD_ATTR 0 (m)
22 LOAD_CONST 2 (2)
25 INPLACE_MULTIPLY
26 ROT_TWO
27 STORE_ATTR 0 (m)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
Solution 2:
Local names is faster because Python does some optimization that local names don't need dict access, on the other hand, instance attributes need to access the __dict__
of the object.
This is also the reason why local names are faster than global names.
Post a Comment for "Why Is Local Variable Access Faster Than Class Member Access In Python?"