在玩time
的python执行时,我发现在单个语句中两次调用time.time()
时出现了奇怪的行为。语句执行期间获取time.time()
的处理延迟非常小。
例如 time.time()-time.time()
如果在理想环境中立即执行,则计算结果为0。
但是,在现实世界中,这导致数量非常少,因为在处理器执行第一次time.time()计算和下次执行time时存在假定的延迟。但是,当运行相同的执行并将其与以相同方式计算的变量进行比较时,结果将朝一个方向倾斜。
请参见下面的小代码段。 对于大型数据集也是如此
import time
counts = 300000
def at_once():
first = 0
second = 0
x = 0
while x < counts:
x += 1
exec_first = time.time() - time.time()
exec_second = time.time() - time.time()
if exec_first > exec_second:
first += 1
else:
second += 1
print('1sts: %s' % first)
print('2nds: %s' % second)
打印:
1sts: 39630
2nds: 260370
除非我的逻辑不正确,否则我希望结果非常接近50:50,但事实并非如此。是否有人可以解释导致这种现象的原因或指出导致结果偏向一个方向的代码逻辑的潜在缺陷?
答案 0 :(得分:3)
是exec_first == exec_second
吗?在这种情况下,您的if-else将1加1。
尝试将if-else更改为类似的内容
if exec_first > exec_second:
first += 1
elif exec_second > exec_first:
second += 1
else:
pass
答案 1 :(得分:2)
您将所有关系分配给一个类别。尝试一下:
import time
counts = 300000
first = 0
second = 0
same = 0
for _ in range(counts):
exec_first = time.time() - time.time()
exec_second = time.time() - time.time()
if exec_first == exec_second:
same += 1
elif exec_first > exec_second:
first += 1
else:
second += 1
print('1sts: %s' % first)
print('same: %s' % same)
print('2nds: %s' % second)
输出:
$ python3 so.py
1sts: 53099
same: 194616
2nds: 52285
$ python3 so.py
1sts: 57529
same: 186726
2nds: 55745
此外,对于为什么您认为函数调用可能花费0的时间,我感到困惑。每次调用都至少需要访问系统时钟并将该值复制到某种临时位置。这在当前的任何计算机上都没有多余的开销。