为什么单个添加需要比单个添加加上单个赋值更长的时间?

时间:2017-01-28 11:31:25

标签: python performance

这是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循环本身对结果有影响,我不会在我的测试中使用它。而且我确信这种不平等可以重现,至少在我的机器上。所以问题是为什么会发生这种情况?

1 个答案:

答案 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倍。如果您的一般目标是优化脚本的运行时间,那么您可能会这样看。