• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Hhehepei
V2EX  ›  程序员

c 真能比 Python 快这么多?

  •  1
     
  •   Hhehepei · 13h 40m ago · 2477 views

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

    Supplement 1  ·  2h 33m ago
    不好意思,敲错字了,这里的"CPython"指的是"Python/C API"
    29 replies    2026-06-13 14:13:16 +08:00
    wu67
        1
    wu67  
       13h 31m ago via iPhone
    py 是这样的,我对他的印象就是读起来爽写起来爽,但是执行的速度和占用的内存一言难尽
    lianyue
        2
    lianyue  
       13h 18m ago
    动态语言都差不多
    jko123
        3
    jko123  
       13h 9m ago via iPhone
    py 慢是老生常谈的事了
    woodchen
        4
    woodchen  
       12h 54m ago
    应该算个别情况吧
    laminux29
        5
    laminux29  
       12h 21m ago
    汇编/C/APP 坐一桌,主打性能,劣势是开发效率; Python/Java/PHP/JS 相反。C# 被夹在中间。
    jark006
        6
    jark006  
       12h 17m ago
    C 毕竟是最接近汇编/机器码的 Native 语言,只要写法不太差,基本能榨干 CPU 性能(要是实现地缓存友好,高频调用还能更快)。
    而 Python 这类用解释器运行的脚本语言是很慢的,但我看这差距,170 -> 4.8 ,都 3 个数量级了,不太正常,我猜估计是 Python 的实现的效率不是很高。
    如果这份程序功能基本已固定的话,建议用 AI 重新使用 RUST/C/C++/GO 这类编译型语言实现,性能会高出很多很多
    jark006
        7
    jark006  
       12h 14m ago
    @jark006 如果只能用于 Python 项目,也可以用这几种语言实现这个功能模块,再包装出 Python 接口也行
    Mac
        8
    Mac  
       12h 8m ago
    肯定啊,机器码和解释型的区别,相当于你用翻译机和人比母语。
    WuSiYu
        9
    WuSiYu  
       11h 48m ago
    python 是这样的,你要是高频跑小操作肯定性能比 c 和 jit 语言差远了。不过解决方法也有很多,你这需求大概套个 Numba 的 @njit 就行了,都不用自己写 C

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

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

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

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

    python 这种动态语言 底层就是 c/c++写的
    iOCZS
        17
    iOCZS  
       3h 38m ago
    c 的正则都能吊打 Python 的字符串顺序查找
    ktyang
        18
    ktyang  
       3h 34m ago
    只从大面上说你的结论是对的,但是具体问题具体分析,这个方法有可能在 py 下或者借助更高效的包也有很多优化潜力。
    xtreme1
        19
    xtreme1  
       3h 34m ago
    py 的 (实验性) jit 加速比甚至都比同类语言慢一个数量级..
    AV1
        20
    AV1  
       3h 30m ago
    别说跟 C 比了,Python 即使跟同为动态语言的 JS 、PHP 比,都是奇慢无比的。
    动态类型是原因之一,没有 JIT 更会吃大亏。
    yetrun
        21
    yetrun  
       3h 17m ago
    CPython 是啥,就不是 python 了吗?
    henix
        22
    henix  
       3h 11m ago
    考虑到你这个是纯计算,而且 Python 有运算符重载,遇到 + 的时候先要看两个操作数有没有重载 + 运算...后果可想而知
    Thiece
        23
    Thiece  
       3h 8m ago
    @yetrun
    是 Python 的一个编程实现,除了 CPython ,还有 Cython 、Pypy 、Nuitka
    yetrun
        24
    yetrun  
       3h 7m ago
    @Thiece 那不就是解释器吗?为啥会有 “使用 CPython 重写了一下函数 A 和函数 B” 这一说?
    Hhehepei
        25
    Hhehepei  
    OP
       2h 35m ago
    @Cu635 "被调用次数多得离谱"指的是函数 A ,大概被调用了几百万次
    传值用 numpy ,内部要拆包了进行计算,因为向量的每一个纬度都是不同的参数,至于最开始写这个的人为什么要这么设计,我也不知道
    Hhehepei
        26
    Hhehepei  
    OP
       2h 34m ago
    @yetrun 不好意思,敲错字了,我想说的是 python/c api
    Hhehepei
        27
    Hhehepei  
    OP
       2h 25m ago
    @awanabe 我知道它快,但是没想到能快这么多
    之前一直听说 java jit 之后速度跟 c 差不多,V8 里跑的 js 不比 java 慢什么的。所以一直感觉虽然 python 会慢,但是可能也就几倍差距,结果差这么多是我没想到的。
    EndlessMemory
        28
    EndlessMemory  
       1h 28m ago
    c 的速度是 Python 的 100 倍啊
    laminux29
        29
    laminux29  
       Just Now
    @Cu635 抱歉,手滑写错了,是 CPP ,不是 APP
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3175 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 06:14 · PVG 14:14 · LAX 23:14 · JFK 02:14
    ♥ Do have faith in what you're doing.