这是我的代码:
elif line.mesg.startswith('^^'):
recog, score = pull_recog(line)
line.recog = recog
line.score = score
print recog + ' '*(20-len(recog)) + '%2.2f'%score
这个问题实际上归结为编译器如何解决这个问题:
编译器是否以某种方式优化此代码:
recog
和score
line.score
和line.recog
?我最初的本能是使用局部变量会更快,但是我没有从timeit
得到好的结果,所以我无法确切地说出来。
这是在for循环中,因此在这种情况下优化确实很重要。
答案 0 :(得分:3)
局部变量更快。 line.score
是两个操作:局部变量检索(用于line
)和属性查找(用于score
)。而recog
只是一个操作,而局部变量检索。一个操作比两个操作快,特别是当两个操作中的一个与一个操作相同时。
通过使用dis
模块检查字节码,您可以非常轻松地看到这一点。
from dis import dis
def myfunc(recog, line):
recog
line.score
dis(myfunc)
这部分是对recog
:
2 0 LOAD_FAST 0 (recog)
这是line.score
:
3 4 LOAD_FAST 1 (line)
7 LOAD_ATTR 0 (score)
Q.E.D。