是什么原因导致Python运算效率这么低呢?

Python是一门目前很流行的编程语言,因其语法简洁、功能强大、上手简单,目前已广泛应用于人工智能等领域,但是python运算效率低,具体是什么原因呢,下列罗列一些:

第一:python是动态语言

一个变量所指向对象的类型在运行时才确定,编译器做不了任何预测,也就无从优化。举一个简单的例子: r = a + b。 a和b相加,但a和b的类型在运行时才知道,对于加法操作,不同的类型有不同的处理,所以每次运行的时候都会去判断a和b的类型,然后执行对应的操作。而在静态语言如C++中,编译的时候就确定了运行时的代码。

另外一个例子是属性查找,关于具体的查找顺序在《python属性查找》中有详细介绍。简而言之,访问对象的某个属性是一个非常复杂的过程,而且通过同一个变量访问到的python对象还都可能不一样(参见Lazy property的例子)。而在C语言中,访问属性用对象的地址加上属性的偏移就可以了。

第二:python是解释执行,但是不支持JIT(just in time compiler)。虽然大名鼎鼎的google曾经尝试Unladen Swallow 这个项目,但最终也折了。

第三:python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。

第四:python GIL,GIL是Python最为诟病的一点,因为GIL,python中的多线程并不能真正的并发。如果是在IO bound的业务场景,这个问题并不大,但是在CPU BOUND的场景,这就很致命了。所以笔者在工作中使用python多线程的情况并不多,一般都是使用多进程(pre fork),或者在加上协程。即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode(默认,可以通过sys.setcheckinterval()设置)就会尝试线程的切换,具体的源代码在ceval.c::PyEval_EvalFrameEx。

第五:垃圾回收,这个可能是所有具有垃圾回收的编程语言的通病。python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡。infoq上有一篇文章,提到禁用Python的GC机制后,Instagram性能提升了10%。感兴趣的朋友可以去仔细研磨。

兔子动态IP致力于为各行业提供最优质的网络服务,不仅可以提供动态IP服务,还可以提供企业级爬虫代理IP服务,为您提供安全稳定、高效便捷的爬虫代理IP服务,提供代理IP资源的同时,还可以设置不同类型的HTTP代理,以及设置去重等等标准,助您不间断获取行业数据,助您轻松跨入 “人工智能”时代。

原文地址:https://blog.51cto.com/14417194/2475634

时间: 2024-10-01 03:14:05

是什么原因导致Python运算效率这么低呢?的相关文章

风险案例-27期-团队建设投入不足、团队成员间缺乏有效沟通,团队合作氛围不好导致项目组工作效率较低

典型案例: M公司中标某单位(甲方)的电子政务系统开发项目.王某是M公司的项目经理,他刚成功的带领一个6人项目团队完成了一个类似项目,因此公司指派王某带领原来的团队负责完成此电子政务系统开发项目. 王某带领原项目团队结合以往经验顺利完成了需求分析.项目范围说明书等前期工作,并通过了客户评审,得到了甲方的确认.由于进度紧张,王某又向公司申请调来了2个开发人员进入项目团队. 项目开始实施后,原项目团队成员和新加入成员之间经常发生争执,对发生的错误相互推诿.原项目团队成员认为新加入成员效率低下,延误项

string.format、string.connect和+=运算 效率计算

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StringFormatEfficiency { class Program { static void Main(string[] args) { string format = "my {0} is {1}"; string name = "name"; string zh

什么原因导致了某些科技圈子里技术最牛逼的人在搞行政,而技术很一般的人在做科研?(转)

最近一年左右兼职技术管理的经验试总结,核心理念就是以人为本. 小作坊 小项目的构成往往是一个相对有经验的人作为 leader,带几个毕业生构成一个三五个人的小作坊.没有达到配置专门的项目管理人员的程度,因此管人管事管技术,三权集中在一个人身上. 对效率上有好的和坏的影响,但也是不错的选择,开发人员一般是比较难管理的,职业的项目经理很难做好这个事情. 这也从一定程度上让这个 leader 的精力极大分散,很难做较多的 coding 工作,分散在项目管理,对外对内协调,以及人才培养,质量控制等工作.

atitit.为什么java体系开发效率这样低的原因and解决

#---开发理念问题(影响度:很大的,2-3倍效率) mvc<>webform server control ajax<> c lient #---吃内存.(这个也意义着ide可以使用的内存降低,造成机器卡..)(影响度:很大的2-3倍效率) 解决:配置高的配置机器...( 4核+ssd) #---环境配置麻烦的,常常这个类库找不到.或者类库冲突.. 暂时没方法解决. 作者 老哇的爪子 Attilax 艾龙,  EMAIL:[email protected] 转载请注明来源: ht

提高python执行效率的方法

python上手很容易,但是在使用过程中,怎么才能使效率变高呢? 下面说一下提高python执行效率的方法,这里只是说一点,python在引入模块过程中提高效率的方法. 例如: 1.我们要使用os模块中的某个属性,那我们可以单独引入os中某个属性 from os import version 同样的我们也可以把引入的模块属性或者对象,直接赋给另外一个变量,使用as方法 from os import version as ver 这样使用方便 2.如果在一个函数中频繁的使用某个模块的属性,那我们可

做事效率太低?你必须改掉这7种坏习惯

成为啊噗星人 搜索微信号:apu_app,订阅啊噗微信,不定期有惊喜,要关注起来哦! 许多创业者每天都忙到停不下来,然而,拼命的工作无法让你战胜数百万的竞争对手.时间总是有限的,一个创业者可以每天工作24小时,每周工作7天.但是竞争对手只需多花一点钱,就能建立起更优秀的团队,这样你所花费的一切时间就都白费了.也许有人要问:"那为何许多小型企业完成了大企业无法完成的工作?"例如Facebook花费数十亿美元收购了只有13名员工的Instagram:Snapchat这个只有30名员工的初创

在C代码中将结构体变量作为参数传递效率忒低

在C语言编程中,我们几乎不可能看见有人将一个结构体变量作为参数进行传递,因为效率太低了.本文尝试从反汇编的角度给出其中的原因. 对于C语言来说,所有的参数传递都是值传递.如果一个变量为指针,那么传递的就是指针变量的值(即某个内存地址). 那么,如果一个参数是结构体变量(包括多个成员),怎么从caller传递到callee呢? 先看下面的代码片段: o foo1.c 1 #define FALSE 0 2 #define TRUE (!0) 3 4 typedef struct point_s {

C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉

原文链接:http://www.crifan.com/csharp_httpwebrequest_getrequeststream_dead_hang_low_efficiency/ [已解决]C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉 [问题] C#中,提交对应的POST类型http请求之前,会执行: Stream postDataStream = req.GetRequestStream(); 然后填充对应的post数据,再提交http的

[MySQL优化] -- 如何定位效率较低的SQL

一般通过以下两种方式定位执行效率较低的 SQL 语句. 通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率较低的 SQL . 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前