当x增加范围时,执行函数的时间将上升而不是下降而不是上升()

2024-10-04 01:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如果这有点不对劲或者我不明白这是怎么回事,那我就不好了。我试图使用下面的代码获取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

我做错了什么?还是我不明白这到底是怎么回事


Tags: 代码inimportdefaultforreturnmaindef
2条回答

range文档中:

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

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

此外,您的值太小,即使range以线性时间运行,也看不到时间上的任何显著差异。因此,您正在测量噪声

  1. 主函数只返回一个生成器
    def main(x):
        return range(1,x)

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

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

这是由于生成器的性质决定的,如果您对其进行迭代,它将被计算。例如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的方法来更明确地说明函数应该做什么

相关问题 更多 >