这是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-fold进行测试。但是,由于K-fold循环本身对结果有影响,我不会在我的测试中使用它。而且我确信这种不平等可以重现,至少在我的机器上。所以问题是为什么会发生这种情况?
答案 0 :(得分:1)
我用pypy运行它(必须设置empty_loop_t = 0)并得到以下结果:
(10000000, 'iterations single additions:', 0.014394044876098633)
(10000000, 'iterations single additions and single assignments:', 0.018398046493530273)
所以我想这取决于解释器对源代码的作用以及解释器如何执行它。可能是故意分配比使用非JIT解释器处理结果需要更少的操作和工作量,而JIT编译器强制代码执行实际操作数。
此外,使用JIT解释器可使您的脚本在我的配置上运行快约50倍。如果您的一般目标是优化脚本的运行时间,那么您可能会这样看。