您可以暂时将计时器周期降低到由
wPeriodMin返回的值
timeGetDevCaps。以下定义了
timer_resolution调用
timeBeginPeriod和
timeEndPeriod函数的上下文管理器。
import timeitimport contextlibimport ctypesfrom ctypes import wintypeswinmm = ctypes.WinDLL('winmm')class TIMECAPS(ctypes.Structure): _fields_ = (('wPeriodMin', wintypes.UINT), ('wPeriodMax', wintypes.UINT))def _check_time_err(err, func, args): if err: raise WindowsError('%s error %d' % (func.__name__, err)) return argswinmm.timeGetDevCaps.errcheck = _check_time_errwinmm.timeBeginPeriod.errcheck = _check_time_errwinmm.timeEndPeriod.errcheck = _check_time_err@contextlib.contextmanagerdef timer_resolution(msecs=0): caps = TIMECAPS() winmm.timeGetDevCaps(ctypes.byref(caps), ctypes.sizeof(caps)) msecs = min(max(msecs, caps.wPeriodMin), caps.wPeriodMax) winmm.timeBeginPeriod(msecs) yield winmm.timeEndPeriod(msecs)def min_sleep(): setup = 'import time' stmt = 'time.sleep(0.001)' return timeit.timeit(stmt, setup, number=1000)例
>>> min_sleep()15.6137827>>> with timer_resolution(msecs=1): min_sleep()...1.2827173000000016
with块之后,将恢复原始计时器分辨率:
>>> min_sleep()15.6229814



