随着 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
在线性时间内会 运行,您的值也太小,看不出时间上有任何显着差异。因此,您正在测量噪音。
- 你的主要功能只有returns一个生成器
def main(x):
return range(1,x)
基本上,生成器不会立即执行,而是具有两个值且尚未对其求值的迭代器。所以给x=1
、x=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 )
只创建了一个对象 - 它没有评估它
- 请注意 python 与 java 或 javascript 等其他语言相比有一些其他编码标准,其中
timeThem
是专有名称,但在 python,我们遵循 pep8 说应该使用像 time_them
这样的 snake-case。
就个人而言,我建议您使用 time_function
之类的东西来更明确地说明您的函数应该做什么。
如果这有点菜鸟或者我不明白它是如何工作的,那我就不好意思了。我正在尝试使用下面的代码获取 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
在线性时间内会 运行,您的值也太小,看不出时间上有任何显着差异。因此,您正在测量噪音。
- 你的主要功能只有returns一个生成器
def main(x):
return range(1,x)
基本上,生成器不会立即执行,而是具有两个值且尚未对其求值的迭代器。所以给x=1
、x=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 )
只创建了一个对象 - 它没有评估它
- 请注意 python 与 java 或 javascript 等其他语言相比有一些其他编码标准,其中
timeThem
是专有名称,但在 python,我们遵循 pep8 说应该使用像time_them
这样的 snake-case。 就个人而言,我建议您使用time_function
之类的东西来更明确地说明您的函数应该做什么。