【问题标题】:Time to excecute function goes up instead of down instead of up as x increases - Range()随着 x 的增加,执行函数的时间上升而不是下降而不是上升 - Range()
【发布时间】:2021-05-01 21:06:50
【问题描述】:

如果这有点笨拙,或者我不明白这是如何工作的,那就太糟糕了。我正在尝试使用下面的代码获取range(1,x) 的时间。

代码

import timeit
def main(x):
    return range(1,x)
def timeThem(x):
    start = timeit.default_timer()
    main(x)
    stop = timeit.default_timer()
    return stop - start
for i in range(5):
    print(timeThem(i))

现在我预计由于 x 在range(1,x) 中变得越来越大,执行此操作所需的时间会更长。我猜它看起来像这样。

预期输出

.01 .02 .03 .04 .05

但是不,我的时间输出由于某种原因变短了。如下所示,我得到的东西与我想象的完全不同。

收到的输出

8.219999999975469e-07
6.740000000060586e-07
1.0670000000004287e-06
4.939999999967193e-07
4.420000000032731e-07

我在这里做错了什么?还是我只是不明白这到底是如何工作的?

【问题讨论】:

    标签: python performance time range


    【解决方案1】:

    来自range 文档:

    返回一个对象,该对象会逐步生成从开始(包括)到停止(不包括)的整数序列

    range 不生成实际序列,因此它可以在恒定时间内运行。请注意,对结果的迭代是在线性时间内完成的。

    此外,即使range 会以线性时间运行,您的值也太小,无法看到时间上有任何显着差异。因此,您正在测量噪音

    【讨论】:

    • 所以基本上,我可以在一个范围内有一百个元素,与一个相比,我仍然会在同一时间获得?还有为什么时代会有如此大的差异。 9.579999999953515e-07 and 1.1359999999988046e-06
    • @BuddyBobIII 大约 10% 的差异是“巨大的”?
    • 是的。例如,您可以测试45978564 in range(1_000_000_000_000_000) 在很短的时间内运行,因为范围产生的结果。至于计时,在微秒的粒度上,计时根本不准确,因为你的处理器(频率缩放、分支预测等)、解释器和操作系统。
    • 谁能给我一个例子,我会看到预期的时间变化?
    • 我不明白你的问题,但如果你想测试一个计算是在线性时间内完成的情况,你可以尝试使用@987654326 从序列对象构建一个列表(包含所有项目) @ 并使用更大的 x 值(例如,使用 for i in range(0,100000,1000) 调用 timeThem)。
    【解决方案2】:
    1. 你的主函数只返回一个生成器
        def main(x):
            return range(1,x)
    

    基本上,生成器不会立即执行,而是具有两个值且尚未对其进行评估的迭代器。所以不管你给x=1x=100还是x=1000000都没有关系。从性能的角度来看,它基本上返回一个元组,如

    def main(x):
        return (1,x) 
    

    这是由于 generator 的性质,如果您对其进行迭代,它只会被评估。例如。 list(range(0, <infity>) ) 会破坏你的记忆,但 for i in range(0,<infity>): print(i) 只会花很长时间来计算。

    所以range(x, 1000 ) 只是创建了一个对象 - 它没有评估它

    1. 请注意,python 有一些其他的编码标准,而不是其他语言,如 java 或 javascript,其中 timeThem 是一个专有名称,但在 python 中,我们遵循 pep8 说应该使用像 time_them 这样的蛇形大小写。 就个人而言,我建议您使用 time_function 之类的内容来更明确地说明您的功能应该做什么。

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多