Hacker News 中文摘要

RSS订阅

程序员必知的Python数字 -- Python Numbers Every Programmer Should Know

文章摘要

文章介绍了Python程序员需要了解的各类操作性能数据,包括列表操作、文件读写、数据结构选择、内存占用等,并提供了基准测试代码和系统信息供参考比较。

文章总结

Python开发者必知的性能数据

核心要点

本文通过系统化基准测试,揭示了Python在内存占用、基础运算、集合操作、序列化、Web框架等关键领域的性能表现。所有测试基于CPython 3.14.2(ARM架构,14核/24GB内存环境),完整代码已开源。


内存占用(关键数据)

| 对象类型 | 内存消耗 | |-----------------------|--------------| | 空Python进程 | 15.73 MB | | 空字符串 | 41字节 | | 小整数(0-256) | 28字节 | | 包含1000个整数的列表 | 7.87 KB | | 使用__slots__的类实例 | 比普通类节省52%内存 |

类实例内存对比图


运算性能(纳秒级操作)

| 操作类型 | 耗时 | 吞吐量 | |----------------------|-------------|------------| | 整数加法 | 19.0 ns | 5270万次/秒 | | f-string格式化 | 64.9 ns | 1540万次/秒 | | 列表追加元素 | 28.7 ns | 3480万次/秒 | | 字典键值查询 | 21.9 ns | 4570万次/秒 |

重要发现:列表推导比等效for循环快20%


序列化性能对比

| 库名称 | 复杂对象序列化耗时 | 性能倍数(相比stdlib) | |------------|----------------|-------------------| | orjson | 310 ns | 11倍更快 | | 标准库json | 2.65 μs | 基准值 | | msgspec | 445 ns | 6倍更快 |

JSON性能对比图


Web框架吞吐量

| 框架 | 请求延迟 | 吞吐量 | |-----------|--------|------------| | FastAPI | 8.63 μs | 11.59万请求/秒 | | Django | 18.1 μs | 5.54万请求/秒 | | Flask | 16.5 μs | 6.07万请求/秒 |


关键建议

  1. 内存敏感场景:优先使用__slots__和元组
  2. 高频查询:用字典/集合替代列表查询(快200倍)
  3. JSON处理:生产环境推荐orjson
  4. 异步编程:注意coroutine创建开销(约47ns/次)
  5. 数据存储:SQLite的PK查询比MongoDB快34倍

基准测试方法论:所有测试均经过预热,采用中位数结果,完整代码见GitHub仓库

最后更新:2025年12月31日

评论总结

评论总结:

  1. 对文章实用性的质疑(7条评论)
  • 认为这些具体数字对大多数Python程序员不实用 "这些图表远非'每个程序员都应该知道'的内容" (Nice numbers... far away from what "every programmer should know") "10年Python经验,这种微优化最多只用到过2次" (I've 10+ years... had need for this in like 2 times)
  1. 对数据准确性的质疑(5条评论)
  • 指出数字会随环境变化且不具普适性 "141字节的100字符字符串不适用于非ASCII字符串" (141 bytes... won't hold for non-ASCII strings) "不同硬件和Python版本的内存占用差异很大" (My M4 Max... takes 19.73MB, Intel Mac takes 37.22MB)
  1. 对Python性能的讨论(6条评论)
  • 认为过度关注性能时应换语言 "当这些数字开始重要时,Python就不再是合适的工具" (When this starts to matter... stops being the right tool) "如果是需要关注微基准的领域,就不该用Python" (If those micro benchmarks mattered... wouldn't be using python)
  1. 支持文章的观点(3条评论)
  • 认为了解性能数字有助于解决问题 "遇到性能问题时,了解这些数字能帮助解决而不必换语言" (knowing these numbers... better at using the tool) "文章本意是建立操作成本的心理模型" (My goal was... create a reference to have a mental model)
  1. 对具体内容的指正(4条评论)
  • 指出文章中的技术错误 "字符串有三种类型(1/2/4字节)" (There are three types of strings...) "迭代和成员测试被混淆" (It's the membership test that is slower... not the iteration)
  1. 对标题的解读(2条评论)
  • 指出标题是致敬经典文章 "标题是对Jeff Dean著名文章的戏仿" (The title is a play on Jeff Dean's... not meant to be literal)