python - 为什么单次加法比单次加法加单次赋值花费的时间更长?

标签 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折进行测试。不过,由于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/

相关文章:

python Fabric,如何不并行化本地命令?

python - numpy savetxt 函数中换行参数的问题

python - 获取 Pandas 中每个标识符的时间序列的最新非 NaN 值

ios - 到达 SLComposeServiceViewController::awakeFromNib 需要很长时间

javascript - 有效地将 JavaScript 键和值数组转换为对象

python - 并非所有参数都在SQL语句中使用,sql语句中的变量

python - 执行类似 ./program_name 的程序

performance - elasticsearch中的ConstantScoreQuery

performance - SSRS 性能之谜

performance - MongoDB 按许多参数过滤(复合索引或不复合索引)