Python中如何获取分辨率达1微秒的精确时间?
time.time()返回浮点数格式的Unix时间戳,本身存在浮点数精度损耗,加上不同操作系统对默认系统时钟的分辨率限制,多数场景下实际分辨率只有10~15微秒,Windows部分旧环境甚至更低,确实无法满足1微秒级的精度要求,以下是经过实测可用的方案:
跨平台优先选择:
time.perf_counter_ns()(Python 3.7+)
这是Python标准库提供的最高精度计时接口,底层直接读取CPU/主板提供的硬件级高性能计数器,不受NTP校时、系统时钟跳变影响,返回值为整数类型的纳秒计数,实际硬件层面分辨率普遍在100ns~1us区间,完全满足1微秒精度要求。
基础调用示例:import time def get_highres_usec(): # 返回微秒级高精度单调时间 return time.perf_counter_ns() // 1000如果需要获取绝对Unix时间戳(从1970年起算的时间),只需要在程序启动阶段做一次偏移校准,多次采样抵消单次读取的误差即可:
import time # 启动时采样100次计算平均偏移,降低校准误差 offset_samples = [] for _ in range(100): perf_t = time.perf_counter_ns() wall_t = time.time_ns() offset_samples.append(wall_t - perf_t) _TIME_OFFSET_NS = sum(offset_samples) // len(offset_samples) def get_abs_usec_timestamp(): # 返回微秒级绝对Unix时间戳 return (time.perf_counter_ns() + _TIME_OFFSET_NS) // 1000校准完成后后续调用不需要再读低分辨率的系统时钟,精度可以稳定维持在1微秒以内。
绝对时间直读方案:
time.time_ns()(Python 3.7+)
如果不需要兼容Python 3.7以下版本,且不需要做短间隔的高精度差值计算,可以直接调用这个接口。它返回整数类型的纳秒级Unix时间戳,避免了time.time()的浮点数精度损失,Linux平台下原生分辨率就低于1微秒,Windows平台在Python 3.10+版本优化了时钟读取逻辑后,实测分辨率也能达到1~2微秒,基本满足要求:import time usec_abs_time = time.time_ns() // 1000Python 3.7以下版本兼容方案
低版本Python没有纳秒级标准接口,可以通过ctypes直接调用操作系统原生高精度时钟API:- Linux/macOS:调用
clock_gettime,传入CLOCK_REALTIME获取绝对时间,传入CLOCK_MONOTONIC_RAW获取不受校时影响的高精度单调时间,返回的timespec结构自带纳秒精度 - Windows:调用
QueryPerformanceCounter和QueryPerformanceFrequency接口读取硬件性能计数器,分辨率可达亚微秒级,和高版本perf_counter的底层实现逻辑一致
- Linux/macOS:调用
避坑提示:不要使用
datetime.datetime.now()获取高精度时间,它的底层实现依然依赖time.time(),精度和分辨率和后者没有区别,无法达到1微秒要求。
内容的提问来源于stack exchange,提问作者Kumar

