c 真能比 Python 快这么多?

14 小时 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 的使用是不是有什么问题了。

2576 次点击
所在节点    程序员
29 条回复
yetrun
4 小时 10 分钟前
CPython 是啥,就不是 python 了吗?
henix
4 小时 5 分钟前
考虑到你这个是纯计算,而且 Python 有运算符重载,遇到 + 的时候先要看两个操作数有没有重载 + 运算...后果可想而知
Thiece
4 小时 2 分钟前
@yetrun
是 Python 的一个编程实现,除了 CPython ,还有 Cython 、Pypy 、Nuitka
yetrun
4 小时 0 分钟前
@Thiece 那不就是解释器吗?为啥会有 “使用 CPython 重写了一下函数 A 和函数 B” 这一说?
Hhehepei
3 小时 29 分钟前
@Cu635 "被调用次数多得离谱"指的是函数 A ,大概被调用了几百万次
传值用 numpy ,内部要拆包了进行计算,因为向量的每一个纬度都是不同的参数,至于最开始写这个的人为什么要这么设计,我也不知道
Hhehepei
3 小时 27 分钟前
@yetrun 不好意思,敲错字了,我想说的是 python/c api
Hhehepei
3 小时 19 分钟前
@awanabe 我知道它快,但是没想到能快这么多
之前一直听说 java jit 之后速度跟 c 差不多,V8 里跑的 js 不比 java 慢什么的。所以一直感觉虽然 python 会慢,但是可能也就几倍差距,结果差这么多是我没想到的。
EndlessMemory
2 小时 22 分钟前
c 的速度是 Python 的 100 倍啊
laminux29
54 分钟前
@Cu635 抱歉,手滑写错了,是 CPP ,不是 APP

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

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

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

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

© 2021 V2EX