随着 x 的增加,执行函数的时间增加而不是减少而不是增加 - Range()

Time to excecute function goes up instead of down instead of up as x increases - Range()

如果这有点菜鸟或者我不明白它是如何工作的,那我就不好意思了。我正在尝试使用下面的代码获取 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

我在这里做错了什么?还是我只是不明白这是怎么回事?

来自 range 文档:

Return an object that produces a sequence of integers from start (inclusive) to stop (exclusive) by step.

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

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

  1. 你的主要功能只有returns一个生成器
    def main(x):
        return range(1,x)

基本上,生成器不会立即执行,而是具有两个值且尚未对其求值的迭代器。所以给x=1x=100还是x=1000000都没有关系。从性能的角度来看,它基本上是 returns 一个类似

的元组
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 这样的 snake-case。 就个人而言,我建议您使用 time_function 之类的东西来更明确地说明您的函数应该做什么。