这是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次迭代单个加法:0.19701123237609863
10000000次迭代单个加法和单个分配: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/

10-10 01:03