这是我的代码:
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 循环内,因此在这种情况下优化实际上很重要。
最佳答案
局部变量更快。 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.
关于python - 调用局部变量和调用对象的实例变量之间有性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25531499/