python 性能差的原因_Python计算性能差的几条原因

也不是完全翻译,就算是结合了自己使用python得心得,然后看了High Performance Python之后得总结吧 在此总结一下影响Python性能的原因。

Python解释器做了许多工作来抽象底层得计算单元(包括CPU 各种内存 总线)操作,所以当我们使用Python时,从不用担心为数组分配内存得问题,也不用管内存管理得问题。

但这也是把双刃剑,有好也有坏。

首先,Python对于底层操作得抽象使得vectorization(向量化)计算性能提升方法,不能一步实现。在纯Python代码中,我们不能除以元素均为float类型数据得列表,只能每次除以其中得一个元素,这就是不能向量化。当然,这个问题可以通过使用类似Numpy这样得外部库添加向量化操作来解决。

其次,Python对于底层操作得抽象使得基于使用L1/L2层cache来存储数据用于下次运算的性能优化方法不能实现。因为python得garbage_collect机制,使得数据在内存中不得到最优排列,这产生了许多内存碎片,进而会引发以下这种情况,如果某次数据传递完全利用了bus得带宽,但因为内存碎片造成了一次原算所需数据得缺失,所以本次运算会被丢弃,还要至少再重发一次数据,这就造成了数据发送时间得延长,也会造成性能下降。

然后是Python的动态类型和不被编译。许多静态语言,比如C,首先会对代码进行编译,而在编译阶段,编译器会使用很多技巧来最优化所生成得中间代码以及变量存储在内存中得排列方式(比如结构体中得边界对齐).而纯Python代码虽然也进行编译,但不会像C语言编译那样进行存储优化,而且更糟糕得是,其动态特征使得对原生Python代码得优化难以进行,因为在运行过程中python代码不断变化。但现在有一些方法来减轻这种问题对于性能得影响,首先想到得是Cextension,这个第三方模块让Python可以被编译。

最后,是大家最熟悉得GIL(全局线程琐),这使得纯Python代码在使用多线程技术时,不能利用当前最流行得多核CPU,极大得影响了其计算性能。不过,这个问题可以通过使用multiprocessing模块来首先进行多进程操作,或使用Cextension等其他方法来克服这个问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值