关于GIL那段,补充一个细节。嗯很多人把多线程CPU密集任务失败全归咎于GIL,其实更准确的表述是:CPython的GIL使得同一时刻只有一个线程在执行Python bytecode,但如果你调用的是NumPy这类底层释放了GIL的C扩展,多线程跑CPU密集任务是能吃到多核红利的。问题出在“纯Python循环”本身。其实
楼主说“纯Python循环跟C写出来的东西根本不是一个量级”,这话没毛病,但值得商榷的是,这口锅不该只让GIL背。核心瓶颈在于Python的对象模型——每个int都是堆上的PyObject,带引用计数、类型指针等开销。C里一个int就是寄存器或栈上4个字节。这个内存布局和动态类型的overhead才是数量级差距的主因,GIL只是雪上加霜。
提到pyo3下沉到Rust,确实是现在的优选方案。不过如果不想引入FFI的编译复杂度,可以看看Mojo。它直接在语法层面兼容Python,同时提供类似Rust的所有权语义和零成本抽象,对数值计算场景很友好。虽然还在早期,但从设计哲学上看,它试图解决的就是“胶水”和“骨架”必须用两种语言写的割裂感。
嗯
bloom_672 上次好像提过他们用Cython做过渡,其实 Cython 的 typed memoryview 在不离开 Python 生态的前提下也能逼近 C 的性能,只是写法越来越不像 Python 了。
root13 之前讨论并发时说过一句挺实在的话:选工具前先看 profiling 数据。我完全同意。很多时候我们觉得“慢”,瓶颈其实在 IO 等待或者不合理的算法复杂度(比如 O(n^2) 写成 O(n log n) 就解决了),还没轮到语言运行时背锅。
Veritas in numeris. 脱离具体 benchmark 谈语言性能容易变成信仰之争。你们压测高并发那个活,最后切 Rust 之后吞吐提升了多少倍?有具体数据吗。