c 真能比 Python 快这么多?

10 小时 33 分钟前
 Hhehepei

事情是这样的,最近几天在接手别人的一个 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 的使用是不是有什么问题了。

1916 次点击
所在节点    程序员
24 条回复
wu67
10 小时 24 分钟前
py 是这样的,我对他的印象就是读起来爽写起来爽,但是执行的速度和占用的内存一言难尽
lianyue
10 小时 11 分钟前
动态语言都差不多
jko123
10 小时 3 分钟前
py 慢是老生常谈的事了
woodchen
9 小时 47 分钟前
应该算个别情况吧
laminux29
9 小时 14 分钟前
汇编/C/APP 坐一桌,主打性能,劣势是开发效率; Python/Java/PHP/JS 相反。C# 被夹在中间。
jark006
9 小时 10 分钟前
C 毕竟是最接近汇编/机器码的 Native 语言,只要写法不太差,基本能榨干 CPU 性能(要是实现地缓存友好,高频调用还能更快)。
而 Python 这类用解释器运行的脚本语言是很慢的,但我看这差距,170 -> 4.8 ,都 3 个数量级了,不太正常,我猜估计是 Python 的实现的效率不是很高。
如果这份程序功能基本已固定的话,建议用 AI 重新使用 RUST/C/C++/GO 这类编译型语言实现,性能会高出很多很多
jark006
9 小时 7 分钟前
@jark006 如果只能用于 Python 项目,也可以用这几种语言实现这个功能模块,再包装出 Python 接口也行
Mac
9 小时 2 分钟前
肯定啊,机器码和解释型的区别,相当于你用翻译机和人比母语。
WuSiYu
8 小时 41 分钟前
python 是这样的,你要是高频跑小操作肯定性能比 c 和 jit 语言差远了。不过解决方法也有很多,你这需求大概套个 Numba 的 @njit 就行了,都不用自己写 C

python 跑计算的正确玩法是调这种加速库,这些库可以从 python ast 中抽取你的运算行为,然后用更高效的代码替代。此时你的 python 运算代码只起到一个描述的作用,真正被执行的已经不是它了
billccn
8 小时 18 分钟前
纯数学函数的话直接上 Cython 应该就行了,编译结果应该和 C 差不多快。

其实 numpy 这一类的库出现的目的就是用 native 函数加速 python 处理,如果用了 numpy 还很慢,那很可能是使用姿势不对,比如在 python 里面对 numpy 对象进行了 iterate 等操作。
forisra
7 小时 8 分钟前
?这不是编译原理的内容吗。
msg7086
6 小时 57 分钟前
C 有更多的优化手段,比如 SIMD 化,比如智能内联减少函数调用次数。
具体优化效果要看具体代码,不过一般而言计算密集型的差距确实会很大的。
所以一旦开始资源密集型计算,早点切到 Java 或 C++家族才是明智的选择。
drymonfidelia
6 小时 44 分钟前
@laminux29 c#的 jit 很强 部分场景甚至能反超 c
Cu635
4 小时 18 分钟前
“首先调用了几次函数 B”,几次应该不能算“被调用的次数实在是多的离谱”吧?

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

@laminux29 #5
/APP ?
skinny
3 小时 31 分钟前
Python 就这样,你写 CPU 密集代码特别慢、内存占用特别特别大,实际上写过几种不同语言的实现就知道了,当初我也惊讶内存占用这块怎么差距那么离谱在这吐槽,还有杠精说我不会写代码,但是扒它内存结构就知道内存占用小不了
awanabe
1 小时 3 分钟前
大学学语言的时候应该都是基础知识吧
越接触底层的语言 速度越快

python 这种动态语言 底层就是 c/c++写的
iOCZS
31 分钟前
c 的正则都能吊打 Python 的字符串顺序查找
ktyang
27 分钟前
只从大面上说你的结论是对的,但是具体问题具体分析,这个方法有可能在 py 下或者借助更高效的包也有很多优化潜力。
xtreme1
27 分钟前
py 的 (实验性) jit 加速比甚至都比同类语言慢一个数量级..
AV1
23 分钟前
别说跟 C 比了,Python 即使跟同为动态语言的 JS 、PHP 比,都是奇慢无比的。
动态类型是原因之一,没有 JIT 更会吃大亏。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1220070

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX