算是一个小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的方法