所以我正在写一个函数,它接受一个元组作为参数,并为它做了一堆东西。这里是什么样子:Python是否将函数参数加载到寄存器中,还是将它们保存在堆栈中?
def swap(self, location):
if (location[0] < 0 or location[1] < 0 or
location[0] >= self.r or location[1] >= self.c):
return False
self.board[0][0] = self.board[location[0]][location[1]]
self.board[location[0]][location[1]] = 0
self.empty = (location[0],location[1])
我试图让我的代码尽可能高效,所以因为我不修改的location
的值,它是有意义的加载寄存器变量(loc0 = location[0]; loc1 = location[1]
)是为了更快的计算(零周期读取)还是location
已经由Python编译器在作为函数参数传递时加载到寄存器中?
编辑:我咬紧牙关,跑了一些测试。以下是与重复输入运行1000万次该功能的结果(以秒计):"up", "down", "left", "right"
(分别)
Code as is:
run#1: 19.39
run#2: 17.18
run#3: 16.85
run#4: 16.90
run#5: 16.74
run#6: 16.76
run#7: 16.94
Code after defining location[0] and location[1] in the beginning of the function:
run#1: 14.83
run#2: 14.79
run#3: 14.88
run#4: 15.033
run#5: 14.77
run#6: 14.94
run#7: 14.67
这就是在性能增加16%的平均值。我的情况绝对不是微不足道的。当然,这不是科学的,因为我需要在更多的环境中进行更多的测试,并提供更多的输入,但足以满足我的简单用例!
使用Python 2.7在Macbook Pro (Early 2015)上测量的时间,其中Broadwell i5-5257U CPU(2c4t max turbo 3.1GHz,持续2.7GHz,3MB三级缓存)。
IDE是:PyCharm Edu 3.5.1 JRE:1.8.0_112-release-408-b6 x86_64 JVM:OpenJDK 64位服务器虚拟机。
不幸的是,这是针对基于代码速度评分的课程。
如果你做'loc0 = location [0]',你正在设置一个变量,而不是“寄存器”。 – BrenBarn
你正在使用哪种python JIT编译器?如果你使用的是intepreter,那么任何Python变量都不会存在于不同表达式之间的寄存器中。在C中,使用局部变量的一个好处是有可能出现混叠。 (例如,如果编译器认为修改self.board [0] [0]也可能修改了位置[0],则将其读入本地会让编译器将其保存在寄存器中。)IDK(如果这是Python中的事情)。 (我在这里是因为[tag:assembly]标签) –
@BrenBarn是的,但是编译器会优化定义的变量,这些变量通过为它们分配寄存器来频繁使用。 – QuantumHoneybees