2026-05-28 ·
日常编程 ·
59330
time.time_ns() 返回自 Unix 纪元起的纳秒整数,转毫秒需用 // 1_000_000 截断;它比 time.time() 更精确、无浮点误差,适用于高精度时间戳场景。
time.time_ns() 返回的是纳秒,不是毫秒
直接调用 time.time_ns() 得到的是自 Unix 纪元以来的纳秒数(int 类型),不是毫秒。如果你要毫秒级时间戳(即精确到毫秒的整数,常用于日志、API 请求、数据库写入等场景),需要手动转换。
常见错误是误以为 time.time_ns() 默认返回毫秒,结果得到一个 19 位数字(如 1718234567890123456),远超预期的 13 位毫秒时间戳(如 1718234567890)。
纳秒转毫秒:除以 1_000_000(10⁶),并用 // 整除避免浮点误差
不要用 round() 或 int() 包裹浮点除法,会引入精度漂移或舍入偏差
time.time_ns() 在 Python 3.7+ 可用,且比 time.time() 更精确、无浮点舍入问题
获取毫秒时间戳的推荐写法
最稳妥的方式是基于 time.time_ns() 手动截断到毫秒,而非依赖 time.time() 后乘 1000 —— 后者可能因浮点表示丢失精度(例如 1718234567.890123 × 1000 → 1718234567890.123,再 int() 会得 1718234567890,看似一样,但极端情况下可能少 1 毫秒)。
正确示例:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
import time
ms_timestamp = time.time_ns() // 1_000_000
print(ms_timestamp) # 例如:1718234567890
用 // 1_000_000 是整数截断,不四舍五入,语义清晰且可预测
下划线分隔符 1_000_000 提高可读性,Python 3.6+ 支持
该值是 UTC 时间,与系统时区无关,适合跨服务时间对齐
time.time_ns() 和 time.time() 的关键差异
两者都返回自 Unix 纪元起的时间,但底层机制和适用场景不同:
time.time() 返回 float,受 IEEE 754 双精度限制,约在 2038 年后对毫秒精度开始丢帧(高位浮点数无法精确表示低位毫秒变化)
time.time_ns() 返回 int,无精度衰减,适合长期运行、高频打点或金融/工业级时间敏感场景
time.time_ns() 不受系统时钟调整(如 NTP 跳变)影响,更接近单调时钟行为;而 time.time() 是墙上时钟,会随系统时间校准跳变
若需兼容 Python time.time() + 乘法,但务必注意浮点风险
别把毫秒时间戳当“本地时间”用
毫秒时间戳(无论怎么算)本质是 UTC 偏移量,它本身不含时区信息。常见误区是拿到 1718234567890 就直接传给前端 new Date(1718234567890),以为能自动显示本地时间——其实可以,但前提是前后端都约定好这是 UTC 时间戳。如果后端误用本地时区生成时间戳(比如先 datetime.now().timestamp()),就会错 8 小时(东八区)。
始终用 time.time_ns() 或 time.time(),它们天然是 UTC
避免用 datetime.now().timestamp(),它依赖系统本地时区,不可靠
日志中打印时间戳时,建议同时输出 ISO 格式(datetime.fromtimestamp(ms_timestamp / 1000, tz=timezone.utc))便于人工核对
毫秒时间戳看着简单,真正踩坑多在精度截断方式、时区混淆和 Python 版本兼容上。尤其当服务部署在不同 Python 版本或跨时区节点时,time.time_ns() // 1_000_000 这一行代码的写法,比表面看起来更值得抠细节。
Python类中定义的方法默认会自动接收实例对象作为第一个参数,若方法签名未包含self,调用时就会报“多传入1个位置参数”的错误——本质是Python隐式传入了实例,而函数未声明接收。 python类方法定义中必须显式声明`self`参数 在Python中,**所有实例方法(即定义在类内部、用于操作实例数据的方法)都必须将`self`作为第一个形参**。这不是约定俗成,而是语言强制要求:当通过实...
2026-05-29 · 日常编程 · 72851
因为__new__不是原子操作:线程A判断_instance为None后,未执行super().__new__前,线程B也判为None,导致重复创建;GIL不保护跨语句逻辑,需用双重检查锁定(DCL)加threading.Lock确保线程安全。 为什么直接用 __new__ 实现单例在多线程下会失效 因为 __new__ 本身不是原子操作:线程 A 判断 _instance 为 None 后,还没...
2026-05-29 · 日常编程 · 260993
grpcio-reflection 无异步支持因其 servicer 继承同步基类、无 AsyncServicer 实现且依赖同步 I/O;异步调用反射需用 grpc.aio.Channel + stub.ServerReflectionInfo 并 await,自研异步服务端须重写方法并缓存 FileDescriptorSet。 Python 的 grpcio 官方库从 1.39 版本起才正式支...
2026-05-29 · 日常编程 · 148270
在 LlamaIndex 中调用 aevaluate_queries() 等异步方法时,必须将 await 语句置于 async 函数内部,并通过 asyncio.run() 启动事件循环;直接在模块顶层 await 会导致 SyntaxError,这是 Python 异步语法的硬性限制。 在 llamaindex 中调用 `aevaluate_queries()` 等异步方法时,必须将 `awa...
2026-05-29 · 日常编程 · 202266
os.listdir()返回指定路径下一级子项(文件和文件夹)的名称列表,故len()统计的是条目总数而非纯文件数;需配合os.path.isfile(os.path.join(path, f))过滤才能准确计数。 os.listdir() 返回的是什么,为什么不能直接用 len() 统计子目录里的文件数 os.listdir() 只返回指定路径下**一级子项的名称列表**(包括文件和文件夹),不...
2026-05-29 · 日常编程 · 283170
asyncio.all_tasks 返回当前事件循环中所有未完成的Task对象集合(set),为空常因未启动事件循环、无活跃循环、任务已完结或跨线程未正确设置循环。 asyncio.all_tasks 返回什么,为什么有时为空 asyncio.all_tasks 返回当前事件循环中所有未完成的 Task 对象集合(set),但它**只作用于当前线程中已运行且未关闭的事件循环**。常见误区是直接调用...
2026-05-29 · 日常编程 · 250894
APScheduler默认不支持毫秒级调度,因其IntervalTrigger最小单位为秒,传入小于1秒的seconds值会报ValueError;底层依赖time.sleep()和系统轮询,受CPython GIL及操作系统调度延迟影响,实际抖动达10–50ms以上。 为什么 APScheduler 默认不支持毫秒级调度 APScheduler 的 IntervalTrigger 最小单位是秒,...
2026-05-29 · 日常编程 · 256152
本文介绍如何从ping测试结果中提取各ip的延迟数据,并准确计算每个ip对应的平均响应时间,涵盖数据清洗、类型转换、空值处理及完整可运行示例。 本文介绍如何从ping测试结果中提取各ip的延迟数据,并准确计算每个ip对应的平均响应时间,涵盖数据清洗、类型转换、空值处理及完整可运行示例。 在实际网络监控或运维脚本中,常需对多个目标IP执行批量Ping操作,并统计每个IP的平均响应时间(即time=后...
2026-05-29 · 日常编程 · 259452
根本原因是Windows默认SelectorEventLoop调用受限于512句柄的select()系统调用;应改用支持IOCP的ProactorEventLoop,并同步调优连接池等配套组件。 Windows上asyncio报“too many file descriptors in select()”的根本原因 这不是Python代码写错了,是底层事件循环选错了。默认的 SelectorEve...
2026-05-29 · 日常编程 · 75470
绝大多数InvalidArgumentError都源于dtype不匹配,应优先检查x.dtype而非仅print(x);修复方法包括tf.cast统一类型、预处理时指定numpy dtype,或根据上下文选择float32/float64。 绝大多数 InvalidArgumentError 都能靠检查 dtype 快速定位,不是“可能”,而是“大概率就是它”。 报错信息里明说 dtype 不匹配...
2026-05-29 · 日常编程 · 128974