cpython和c++速度,为什么Python程序比用C或C++编写的等效程序慢?

CPython特别慢,因为它没有即时优化器(因为它是参考实现,在某些情况下选择简单性而不是性能)。Unladen Swallow是一个将LLVM支持的JIT添加到CPython的项目,并实现了大量的加速。Jython和IronPython可能比CPython快得多,而且它们有经过高度优化的虚拟机(JVM和.NET CLR)支持。

不过,有一点可以说会让Python慢下来,那就是它是动态类型的,而且每个属性访问都有大量的查找。

例如,调用对象A上的f将导致在__dict__中可能的查找,调用__getattr__等,然后最终调用可调用对象f上的__call__。

对于动态类型,如果您知道要处理的是哪种类型的数据,则可以进行许多优化。例如,在Java或C中,如果有一个要求和的整数的直数组,那么最终的汇编代码可以简单到获取索引i处的值,将其添加到accumulator,然后递增i。

在Python中,很难使代码达到最佳状态。假设您有一个包含ints的list子类对象。在添加任何对象之前,Python必须调用list.__getitem__(i),然后通过调用accumulator.__add__(n)将其添加到“累加器”,然后重复。这里可能会发生大量的替代查找,因为另一个线程可能已经在add或getitem调用之间更改了__getitem__方法、列表实例的dict或类的dict。即使在本地命名空间中找到累加器和列表(以及正在使用的任何变量),也会导致dict查找。当使用任何用户定义的对象时,同样的开销也会应用,尽管对于某些内置类型,这种开销会有所减少。

同样值得注意的是,bigint(Python 3中的int,Python 2.x中的long)、list、set、dict等原始类型是人们在Python中经常使用的。在这些对象上有大量的内置操作已经进行了足够的优化。例如,在上面的例子中,您只需要调用sum(list),而不用使用累加器和索引。坚持这些原则,并使用int/float/complex进行一些数字处理,通常不会出现速度问题,如果这样做了,可能有一个很小的时间关键单元(例如SHA2摘要函数)可以简单地移到C(或Jython中的Java代码)。事实上,当你对C或C++进行编码时,你将浪费掉<>强> > /强>做你可以在几秒钟/行的Python代码中完成的事情。我要说的是,这种折衷总是值得的,除非你正在做一些类似嵌入式或实时编程的事情,但你负担不起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值