Why would Python's datetime.utcnow() always return the same value for microseconds?
我正在玩Python的datetime.datetime.utcnow()方法,我注意到微秒值始终是相同的。
1 2 3 4 5 6 7 | >>> import datetime >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 16, 23, 20, 46, 42286) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 16, 23, 20, 55, 505286) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 16, 23, 21, 1, 552286) |
注意微秒值是如何总是286.为什么会这样?我该怎么做才能解决这个问题?
多一点信息:
这是一个简短的脚本,表明它不仅仅是运气:
1 2 3 4 5 | import datetime, random, time for wait_time in [random.random() for _ in range(10)]: time.sleep(wait_time) print("Waited {}, result {}".format(wait_time, datetime.datetime.utcnow())) |
结果:
1 2 3 4 5 6 7 8 9 10 | Waited 0.6074311218736113, result 2015-11-16 23:35:24.603286 Waited 0.960317012489652, result 2015-11-16 23:35:25.563286 Waited 0.13555474339177553, result 2015-11-16 23:35:25.698286 Waited 0.6179213307667111, result 2015-11-16 23:35:26.315286 Waited 0.2872301475401443, result 2015-11-16 23:35:26.602286 Waited 0.42578113509089066, result 2015-11-16 23:35:27.027286 Waited 0.647233264729425, result 2015-11-16 23:35:27.674286 Waited 0.38930513172405146, result 2015-11-16 23:35:28.063286 Waited 0.6500370260649043, result 2015-11-16 23:35:28.713286 Waited 0.9807308512288959, result 2015-11-16 23:35:29.693286 |
谢谢,
系统信息:
- 在win32上的Python 3.4.3(v3.4.3:9b73f1c3e601,2015年2月24日,22:44:40)[MSC v.1600 64位(AMD64)]
- Windows 7专业版,Service Pack 1. 64位。
- 英特尔酷睿i5-2400 @ 3.10GHz
time.get_clock_info()的结果
1 2 3 4 5 6 7 | Name Adjustable Implementation Monotonic Resolution (seconds) ============ ========== ========================= ========= ==================== clock False QueryPerformanceCounter() True 3.3106597e-07 monotomic False GetTickCount64() True 0.015600099999 perf_counter False QueryPerformanceCounter() True 3.3106597e-07 process_time False GetProcessTime() True 1e-7 time True GetSystemTimeAsFileTime() False 0.015600099999 |
最终编辑:
所以,我第二天早上回到这里(电脑整晚都待在这里),我再次启动了python翻译,现在一切都很好!
什么鬼,伙计?
1 2 3 4 5 6 7 8 | >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 17, 17, 19, 17, 626982) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 17, 17, 19, 18, 234043) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 17, 17, 19, 19, 106130) >>> datetime.datetime.utcnow() datetime.datetime(2015, 11, 17, 17, 20, 7, 707990) |
我仍然感兴趣的是,为什么这样做/可能首先发生,所以如果有人有任何额外的信息,那将是伟大的。可悲的是,我不知道我是否能够复制它......
在一个自然历史博物馆,有一个关于两个人的老笑话,想知道恐龙化石有多久了。一名警卫无意中听到他们说:"哦,这是五亿七千岁"。其中一个人说,"这是一个惊人的数字,它是如何确定的?"警卫说:"好吧,有人告诉我,在我的定位期间,它已经有五亿年了,那是七年前的事了。"
这是使用不同精度水平加在一起两次的结果。假设我在12:03:06开始计时,那个时钟只有很小的分辨率。如果我把时钟加到开始时间,我会得到一系列的时间,如12:03:06,12:04:06,12:05:06,依此类推。
Windows将时间从具有毫秒分辨率和任意开始时间的单调时钟添加到该时钟以微秒分辨率读取零的时间。
一种常见的技术就是将时间缩短到您所依赖的分辨率,当然这不能高于时钟的保证分辨率。我相信这个时钟的保证分辨率是10毫秒。
免责声明:这不是答案。
我看到完全不同的微秒,所以我做了这个实验:
1 2 3 4 5 6 7 | ms = 0 for _ in range(10000): ms_ = datetime.datetime.utcnow().microsecond % 10000 if ms != ms_: diff = (ms_ - ms) % 1000 ms = ms_ print ms, diff |
它显示了微秒的变化(我只是显示了一个数字,所以增加是可见的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 8007 7 # garbage 8984 977 9960 976 937 977 1914 977 2890 976 3867 977 4843 976 5820 977 6796 976 7773 977 8750 977 9726 976 703 977 1679 976 2656 977 3632 976 4609 977 5585 976 |
正如您所看到的,在我的Windows机器上,delta非常一致。它只是不是1000,就像OP的机器一样,这就是为什么我(我们?)观察不同的微秒。 delta可能与某些系统时钟同步,我想,这可能是OP的机器每隔几毫秒重新触发一次?
很想听别人的一些观察。随意评论。
注意:这是一台运行频率为2.30GHz的T4500。