这是Python代码,我使用Python 3.5.2/Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz:
import time
empty_loop_t = 0.14300823211669922
N = 10000000
def single_addition(n):
a = 1.0
b = 0.0
start_t = time.time()
for i in range(0, n):
a + b
end_t = time.time()
cost_t = end_t - start_t - empty_loop_t
print(n,"iterations single additions:", cost_t)
return cost_t
single_addition(N)
def single_addition_plus_single_assignment(n):
a = 1.0
b = 0.0
c = 0.0
start_t = time.time()
for i in range(0, n):
c = a + b
end_t = time.time()
cost_t = end_t - start_t - empty_loop_t
print(n,"iterations single additions and single assignments:", cost_t)
return cost_t
single_addition_plus_single_assignment(N)
输出为:
10000000 iterations single additions: 0.19701123237609863 10000000 iterations single additions and single assignments: 0.1890106201171875
通常,为了得到更可靠的结果,最好使用K折进行测试。不过,由于K折循环本身对结果有影响,所以我在测试中没有使用它。我确信这种不平等可以重现,至少在我的机器上。那么问题是为什么会发生这种情况?
最佳答案
我用 pypy 运行它(必须设置empty_loop_t = 0)并得到以下结果:
(10000000, 'iterations single additions:', 0.014394044876098633)
(10000000, 'iterations single additions and single assignments:', 0.018398046493530273)
所以我想这取决于解释器如何处理源代码以及解释器如何执行它。与使用非 JIT 解释器处理结果相比,故意分配可能需要更少的操作和工作量,而 JIT 编译器会强制代码执行实际数量的操作。
此外,使用 JIT 解释器可以使您的脚本在我的配置上运行速度提高约 50 倍。如果您的总体目标是优化脚本的运行时间,您可能会这样做。
关于python - 为什么单次加法比单次加法加单次赋值花费的时间更长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41909265/