GoForum🌐 V2EX

c 真能比 Python 快这么多?

Hhehepei · 2026-06-13 00:38 · 0 次点赞 · 14 条回复

事情是这样的,最近几天在接手别人的一个 python 写的仿真程序,这个程序的运行速度奇慢无比,于是 -m cProfile 看了一眼
检查了一下之后发现程序运行一次大概 500 秒,其中大约有 170 秒都花在一个模拟用的计算函数里了,暂且称其为函数 A 吧
函数 A 大概做了两件事,首先调用了几次函数 B ,去几个表里查表并线性插值,这个过程大概花了 40 秒,这个 40 秒也是优化过的结果了,它原本的算法能干到 500 秒去了。然后就是对大概 30 个参数进行了一系列运算,我大概统计了一下有哪些运算,列表在下面了

算符 次数
× 30
÷ 5
+ 15
- 10
1

顺便说一下,这个函数传值是用的 np.array ,而且这个函数运行一次其实挺快的,但是被调用的次数实在是多的离谱,所以花的时间就很长了
总之我尝试使用 CPython 重写了一下函数 A 和函数 B ,算法完全没变,想着再怎么样也能把时间减半吧,结果离谱的事情发生了,写完之后-m cProfile 了一下,结果函数耗时 4.8S ,这是不是有点夸张了,c 真能比 python 快这么多?我都开始怀疑我对 cProfile 的使用是不是有什么问题了。

14 条回复
wu67 · 2026-06-13 00:43
#1

py 是这样的,我对他的印象就是读起来爽写起来爽,但是执行的速度和占用的内存一言难尽

lianyue · 2026-06-13 00:58
#2

动态语言都差不多

jko123 · 2026-06-13 01:08
#3

py 慢是老生常谈的事了

woodchen · 2026-06-13 01:23
#4

应该算个别情况吧

laminux29 · 2026-06-13 01:53
#5

汇编/C/APP 坐一桌,主打性能,劣势是开发效率; Python/Java/PHP/JS 相反。C# 被夹在中间。

jark006 · 2026-06-13 01:58
#6

C 毕竟是最接近汇编/机器码的 Native 语言,只要写法不太差,基本能榨干 CPU 性能(要是实现地缓存友好,高频调用还能更快)。 而 Python 这类用解释器运行的脚本语言是很慢的,但我看这差距,170 -> 4.8 ,都 3 个数量级了,不太正常,我猜估计是 Python 的实现的效率不是很高。 如果这份程序功能基本已固定的话,建议用 AI 重新使用 RUST/C/C++/GO 这类编译型语言实现,性能会高出很多很多

jark006 · 2026-06-13 02:03
#7

@jark006 如果只能用于 Python 项目,也可以用这几种语言实现这个功能模块,再包装出 Python 接口也行

Mac · 2026-06-13 02:08
#8

肯定啊,机器码和解释型的区别,相当于你用翻译机和人比母语。

WuSiYu · 2026-06-13 02:28
#9

python 是这样的,你要是高频跑小操作肯定性能比 c 和 jit 语言差远了。不过解决方法也有很多,你这需求大概套个 Numba 的 @njit 就行了,都不用自己写 C

python 跑计算的正确玩法是调这种加速库,这些库可以从 python ast 中抽取你的运算行为,然后用更高效的代码替代。此时你的 python 运算代码只起到一个描述的作用,真正被执行的已经不是它了

billccn · 2026-06-13 02:53
#10

纯数学函数的话直接上 Cython 应该就行了,编译结果应该和 C 差不多快。

其实 numpy 这一类的库出现的目的就是用 native 函数加速 python 处理,如果用了 numpy 还很慢,那很可能是使用姿势不对,比如在 python 里面对 numpy 对象进行了 iterate 等操作。

forisra · 2026-06-13 03:58
#11

?这不是编译原理的内容吗。

msg7086 · 2026-06-13 04:13
#12

C 有更多的优化手段,比如 SIMD 化,比如智能内联减少函数调用次数。 具体优化效果要看具体代码,不过一般而言计算密集型的差距确实会很大的。 所以一旦开始资源密集型计算,早点切到 Java 或 C++家族才是明智的选择。

drymonfidelia · 2026-06-13 04:23
#13

@laminux29 c#的 jit 很强 部分场景甚至能反超 c

Cu635 · 2026-06-13 06:53
#14

“首先调用了几次函数 B”,几次应该不能算“被调用的次数实在是多的离谱”吧?

另外,“这个函数传值是用的 np.array”,只有传值使用 numpy ?内部是什么情况呢?

@laminux29 #5 /APP ?

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: Hhehepei
发布: 2026-06-13
点赞: 0
回复: 0