Why is local variable access faster than class member access in Python?

后端 未结 2 1871
半阙折子戏
半阙折子戏 2020-12-03 14:29

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/         


        
相关标签:
2条回答
  • 2020-12-03 14:43

    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.

    0 讨论(0)
  • 2020-12-03 14:59

    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)
     18           0 LOAD_CONST               1 (0)
                  3 STORE_FAST               1 (m)
    
     19           6 LOAD_FAST                1 (m)
                  9 LOAD_CONST               2 (1)
                 12 INPLACE_ADD         
                 13 STORE_FAST               1 (m)
    
     20          16 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)
     10           0 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)
    
     11          15 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        
    
    0 讨论(0)
提交回复
热议问题