高性能Python-Namespaces

算是一个小Tips

当一个变量、函数、module被Python引用时,Python有一个顺序去寻找这些对象。

  • 首先,先寻找locals(),速度很快,非dictionaries查询
  • 其次,再寻找globals(),速度居中,dictionaries查询
  • 最后,寻找builtin,速度最慢

例子:

import math
from math import sin

def test1(x):
    return math.sin(x)

def test2(x):
    return sin(x)

def test3(x, sin=math.sin):
    return sin(x)

#import timeit
#print(timeit.timeit('test1(100)', 'from __main__ import test1', number = 1000000))
#print(timeit.timeit('test2(100)', 'from __main__ import test2', number = 1000000))
#print(timeit.timeit('test3(100)', 'from __main__ import test3', number = 1000000))

import dis
print(dis.dis(test1))
print(dis.dis(test2))
print(dis.dis(test3))
(env) localhost:highperf wenyong$ python tname.py 
  6           0 LOAD_GLOBAL              0 (math)
              3 LOAD_ATTR                1 (sin)
              6 LOAD_FAST                0 (x)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 RETURN_VALUE
None
  9           0 LOAD_GLOBAL              0 (sin)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 RETURN_VALUE
None
 12           0 LOAD_FAST                1 (sin)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 RETURN_VALUE
None
  • test1, 两次dictionaries查询,一次查询math,一次查询math.sin,速度最慢
  • test2,一次dictionaries查询(math.sin),速度居中
  • test3,一次local查询,速度最快

test3的编码不太pythonic,尽可能采用test2的方法

你可能感兴趣的:(高性能Python-Namespaces)