<p>大卫的帖子试图显示Windows上的时钟分辨率是多少。我被他的输出搞糊涂了,所以我写了一些代码,显示我的Windows 8 x64笔记本电脑上的<code>time.time()</code>分辨率为1毫秒:</p>
<pre><code># measure the smallest time delta by spinning until the time changes
def measure():
t0 = time.time()
t1 = t0
while t1 == t0:
t1 = time.time()
return (t0, t1, t1-t0)
samples = [measure() for i in range(10)]
for s in samples:
print s
</code></pre>
<p>哪些输出:</p>
<pre><code>(1390455900.085, 1390455900.086, 0.0009999275207519531)
(1390455900.086, 1390455900.087, 0.0009999275207519531)
(1390455900.087, 1390455900.088, 0.0010001659393310547)
(1390455900.088, 1390455900.089, 0.0009999275207519531)
(1390455900.089, 1390455900.09, 0.0009999275207519531)
(1390455900.09, 1390455900.091, 0.0010001659393310547)
(1390455900.091, 1390455900.092, 0.0009999275207519531)
(1390455900.092, 1390455900.093, 0.0009999275207519531)
(1390455900.093, 1390455900.094, 0.0010001659393310547)
(1390455900.094, 1390455900.095, 0.0009999275207519531)
</code></pre>
<p>还有一种方法,对delta进行1000个样本的平均值:</p>
<pre><code>reduce( lambda a,b:a+b, [measure()[2] for i in range(1000)], 0.0) / 1000.0
</code></pre>
<p>两次连续运行时的输出:</p>
<pre><code>0.001
0.0010009999275207519
</code></pre>
<p>所以我的Windows 8 x64上的<code>time.time()</code>分辨率是1毫秒。</p>
<p>对<code>time.clock()</code>执行类似的运行将返回0.4微秒的分辨率:</p>
<pre><code>def measure_clock():
t0 = time.clock()
t1 = time.clock()
while t1 == t0:
t1 = time.clock()
return (t0, t1, t1-t0)
reduce( lambda a,b:a+b, [measure_clock()[2] for i in range(1000000)] )/1000000.0
</code></pre>
<p>返回:</p>
<pre><code>4.3571334791658954e-07
</code></pre>
<p>即~<code>0.4e-06</code></p>
<p>关于<code>time.clock()</code>的一个有趣的事情是,它返回自第一次调用该方法以来的时间,因此如果您想要微秒分辨率的墙时间,可以执行以下操作:</p>
<pre><code>class HighPrecisionWallTime():
def __init__(self,):
self._wall_time_0 = time.time()
self._clock_0 = time.clock()
def sample(self,):
dc = time.clock()-self._clock_0
return self._wall_time_0 + dc
</code></pre>
<p>(这可能会在一段时间后漂移,但您可以偶尔更正,例如<code>dc > 3600</code>将每小时更正一次)</p>