В сообщении Дэвида была попытка показать разрешение часов в Windows. Я был озадачен его выводом, поэтому я написал код, который показывает, что time.time()
на моем ноутбуке с Windows 8 x64 имеет разрешение 1 мсек:
# 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
Какие выходы:
(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)
И способ сделать среднее значение для дельты по 1000 выборок:
reduce( lambda a,b:a+b, [measure()[2] for i in range(1000)], 0.0) / 1000.0
Какой вывод на двух последовательных прогонах:
0.001
0.0010009999275207519
Итак, time.time()
на моей Windows 8 x64 имеет разрешение 1 мсек.
Аналогичный запуск на time.clock()
возвращает разрешение 0,4 микросекунды:
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
Возвращает:
4.3571334791658954e-07
Что ~ 1024 *
Интересная вещь в time.clock()
заключается в том, что он возвращает время с момента первого вызова метода, поэтому, если вам нужно время микросекундного разрешения, вы можете сделать что-то вроде этого:
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
(который, вероятно, через некоторое время будет дрейфовать, но вы можете иногда исправлять это, например, dc > 3600
будет исправлять это каждый час)