出于好奇,我希望使用time
模块在Python中看到时间评估的不精确。
我知道像time.time()
和time.sleep()这样的函数是基于CPU时钟的,我所期望的是在时间评估中或多或少随机不精确。
作为第一个实验,我跑了:
import time
mean_1 = 0.0
print("Waiting for 0.5 second 10 times...")
for i in range(10):
start = time.time()
time.sleep(0.5)
end = time.time()
elapsed_time = end - start
print(str(i) + ': ' + str(elapsed_time) + ' s')
mean_1 = mean_1 + elapsed_time
mean_1 = mean_1/10.0
print("----------")
print("Mean time overhead when waiting for 0.5 second : " + str(mean_1 - 0.5) + " s")
哪个输出:
Waiting for 0.5 second 10 times...
0: 0.5008149147033691 s
1: 0.5005350112915039 s
2: 0.500540018081665 s
3: 0.5006759166717529 s
4: 0.5008018016815186 s
5: 0.5007147789001465 s
6: 0.5005414485931396 s
7: 0.5008261203765869 s
8: 0.5005924701690674 s
9: 0.5007064342498779 s
----------
Mean time overhead when waiting for 0.5 second : 0.0006748914718628 s
我首先想到的是,即使CPU时钟不精确,对于工作在纳米级别的CPU来说,平均675μs也是非常重要的。
然而,结果中非常清楚:每个循环步骤的开销都非常稳定。所以我得出结论,这可能是由于time.time()
的执行时间,它包含在全球时间评估中。
可以肯定的是,我尝试了不同的睡眠时间:
import time
mean_1 = 0.0
mean_2 = 0.0
mean_3 = 0.0
print("Waiting for 0.5 second 10 times...")
for i in range(10):
start = time.time()
time.sleep(0.5)
end = time.time()
elapsed_time = end - start
print(str(i) + ': ' + str(elapsed_time) + ' s')
mean_1 = mean_1 + elapsed_time
mean_1 = mean_1/10.0
print("----------")
print("Waiting for 1 second 10 times...")
for i in range(10):
start = time.time()
time.sleep(1.0)
end = time.time()
elapsed_time = end - start
print(str(i) + ': ' + str(elapsed_time) + ' s')
mean_2 = mean_2 + elapsed_time
mean_2 = mean_2/10.0
print("----------")
print("Waiting for 2.0 seconds 10 times...")
for i in range(10):
start = time.time()
time.sleep(2.0)
end = time.time()
elapsed_time = end - start
print(str(i) + ': ' + str(elapsed_time) + ' s')
mean_3 = mean_3 + elapsed_time
mean_3 = mean_3/10.0
print("----------")
print("Mean time overhead when waiting for 0.5 second : " + str(mean_1 - 0.5) + " s")
print("Mean time overhead when waiting for 1.0 second : " + str(mean_2 - 1.0) + " s")
print("Mean time overhead when waiting for 2.0 seconds : " + str(mean_3 - 2.0) + " s")
哪个输出:
Waiting for 0.5 second 10 times...
0: 0.5007686614990234 s
1: 0.5005531311035156 s
2: 0.5007860660552979 s
3: 0.500603199005127 s
4: 0.5007908344268799 s
5: 0.5007991790771484 s
6: 0.5006780624389648 s
7: 0.5008070468902588 s
8: 0.5007193088531494 s
9: 0.5008025169372559 s
----------
Waiting for 1 second 10 times...
0: 1.0012505054473877 s
1: 1.001307725906372 s
2: 1.001314640045166 s
3: 1.0013072490692139 s
4: 1.0011889934539795 s
5: 1.0013320446014404 s
6: 1.0011751651763916 s
7: 1.0012929439544678 s
8: 1.0013163089752197 s
9: 1.001300573348999 s
----------
Waiting for 2.0 seconds 10 times...
0: 2.002312183380127 s
1: 2.0020830631256104 s
2: 2.002326011657715 s
3: 2.0023014545440674 s
4: 2.0022478103637695 s
5: 2.002275228500366 s
6: 2.002082347869873 s
7: 2.0020837783813477 s
8: 2.0023083686828613 s
9: 2.0023066997528076 s
----------
Mean time overhead when waiting for 0.5 second : 0.0007308006286621538 s
Mean time overhead when waiting for 1.0 second : 0.0012786149978638583 s
Mean time overhead when waiting for 2.0 seconds : 0.0022326946258544034 s
因此,如果我的理论是正确的,time.time()
执行时间与time.sleep()
执行时间无关,那么开销在1.0和2.0秒时就会相同。
然而,开销似乎与睡眠时间成正比。所以我的结论是:在评估时间方面似乎存在一个非常重要的,积极的偏见。
所以我的问题(最后)是:
有关实验参数的一些(可能)有用的详细信息: