为了账号安全,请及时绑定邮箱和手机立即绑定

python 时间结果不符合预期:time.time() - time.time()

python 时间结果不符合预期:time.time() - time.time()

慕盖茨4494581 2021-09-14 17:28:38
在玩弄 的 python 执行时time,我发现time.time()在单个语句中调用两次时出现了奇怪的行为。time.time()在语句执行期间获取的处理延迟非常小。例如time.time() - time.time()如果在完美世界中立即执行,则计算结果为 0。然而,在现实世界中,这会导致一个非常小的数字,因为在处理器执行第一次 time.time() 计算和下一次计算时存在假定的延迟。但是,当运行相同的执行并将其与以相同方式计算的变量进行比较时,结果会偏向一个方向。请参阅下面的小代码片段。这也适用于非常大的数据集import timecounts = 300000def 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 += 1print('1sts: %s' % first)print('2nds: %s' % second)印刷:1sts: 396302nds: 260370除非我的逻辑不正确,否则我希望结果非常接近 50:50,但情况似乎并非如此。有没有人可以解释导致这种行为的原因,或者指出导致结果偏向一个方向的代码逻辑的潜在缺陷?
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

会不会是这样exec_first == exec_second?在这种情况下,您的 if-else 会将 1 添加到秒。


尝试将您的 if-else 更改为以下内容:


if exec_first > exec_second:

    first += 1

elif exec_second > exec_first:

    second += 1

else:

    pass


查看完整回答
反对 回复 2021-09-14
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

您将所有关系分配给一个类别。尝试一个中间立场:


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 时间感到困惑。每次调用都至少需要访问系统时钟并将该值复制到某种临时位置。这在任何当前的计算机上都不是免费的。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 884 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号