python - 调用局部变量和调用对象的实例变量之间有性能差异吗?

标签 python optimization compiler-construction

这是我的代码:

        elif line.mesg.startswith('^^'):
            recog, score = pull_recog(line)
            line.recog = recog
            line.score = score

            print recog + ' '*(20-len(recog)) + '%2.2f'%score

这个问题实际上归结为编译器如何处理这个问题:

编译器是否以某种方式优化此代码,而不会造成以下差异:

  1. 调用局部变量recogscore
  2. 调用对象的实例变量line.scoreline.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/

相关文章:

Java:数据结构内存估计

arrays - 为什么 const char *arr 的大小大于 const char arr[]?

c++ - 这个函数定义是如何工作的?

c++ - 为什么在比较范围内的数字时,汇编代码中会出现分支?

java - 如何通过 CompilationTask 设置编译源

java - 为什么每次使用 javacc 工具解析赋值语句时语法检查都会失败?

python - rpy2:将 Python 中的 NA 表示为 R 函数的参数

python - 如何删除numpy中具有相同值的列

python - Heroku Pymongo 在 "Preparing static assets"处部署失败

python - 这是 python eval() 的安全使用吗?