北大青鸟设计培训:怎样才能提高Python运行效率?

Python05

北大青鸟设计培训:怎样才能提高Python运行效率?,第1张

python逐渐走入人们的视线,成为热门编程语言,随之而来,加入python培训的准程序员大军也成为社会热点。

Python具有许多其他编程语言不具备的优势,譬如能通过极少量代码完成许多操作,以及多进程,能够轻松支持多任务处理。

除了多种优势外,python也有不好的地方,运行较慢,下面电脑培训http://www.kmbdqn.cn/为大家介绍6个窍门,可以帮你提高python的运行效率

1.在排序时使用键Python含有许多古老的排序规则,这些规则在你创建定制的排序方法时会占用很多时间,而这些排序方法运行时也会拖延程序实际的运行速度。

最佳的排序方法其实是尽可能多地使用键和内置的sort()方法。

2.交叉编译你的应用开发者有时会忘记计算机其实并不理解用来创建现代应用程序的编程语言。

计算机理解的是机器语言。

为了运行你的应用,你借助一个应用将你所编的人类可读的代码转换成机器可读的代码。

有时,你用一种诸如Python这样的语言编写应用,再以C++这样的语言运行你的应用,这在运行的角度来说,是可行的。

关键在于,你想你的应用完成什么事情,而你的主机系统能提供什么样的资源。

3.关键代码使用外部功能包Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意。

使用C/C++或机器语言的外部功能包处理时间敏感任务,可以有效提高应用的运行效率。

这些功能包往往依附于特定的平台,因此你要根据自己所用的平台选择合适的功能包。

简而言之,这个窍门要你牺牲应用的可移植性以换取只有通过对底层主机的直接编程才能获得的运行效率。

4.针对循环的优化每一种编程语言都强调最优化的循环方案。

当使用Python时,你可以借助丰富的技巧让循环程序跑得更快。

然而,开发者们经常遗忘的一个技巧是:尽量避免在循环中访问变量的属性。

5.尝试多种编码方法每次创建应用时都使用同一种编码方法几乎无一例外会导致应用的运行效率不尽人意。

可以在程序分析时尝试一些试验性的办法。

譬如说,在处理字典中的数据项时,你既可以使用安全的方法,先确保数据项已经存在再进行更新,也可以直接对数据项进行更新,把不存在的数据项作为特例分开处理。

6.使用较新的Python版本你要保证自己的代码在新版本里还能运行。

你需要使用新的函数库才能体验新的Python版本,然后你需要在做出关键性的改动时检查自己的应用。

只有当你完成必要的修正之后,你才能体会新版本的不同。

一:学会正确使用numpy scipy。 numpy scipy写好的绝不自己写,比如矩阵运算等操作,pylab的实现还算不错。各种函数都有,尽量使用他们可以避免初学者大部分的速度不足问题。因为这些函数大部分都是预编译好的。

根据我几年前的测试,python的矩阵运算速度并不慢,(因为你运行的是动态链接库里面的函数而不是脚本)比mathematica快,和matlab持平。

大部分新手不擅长看文档啥都自己造轮子是不好的。当然老手把效率写的比开源库高也不算啥新闻,毕竟有对特定程序的优化

二:减少for的使用,多使用向量化函数,np.vectorlize可以把函数变成对数组逐元素的操作,比for效率高几个华莱士。

三:对内存友好,操作大矩阵的时候减少会引起整矩阵对此copy的操作

四:系统最慢的大部分时候是io,包括上面说的内存操作和频繁的读入读出以及debug输出。避免他们,在需要实时处理的时候引入类似于gpu的pipeline管线机制或者使用灵活的多线程编程可以起到奇效。

五:matplotlib的绘图效率并不高明,在使用交互绘图(plt.ion)的时候减少不必要的刷新率。

原因:1、python是动态语言;2、python是解释执行,但是不支持JIT;3、python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。4、python GIL;5、垃圾回收。

当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间;另一个是运行效率,这是对计算机而言,完成计算任务所需要的时间。编码效率和运行效率往往是鱼与熊掌的关系,是很难同时兼顾的。不同的语言会有不同的侧重,python语言毫无疑问更在乎编码效率,life is short,we use python。

虽然使用python的编程人员都应该接受其运行效率低的事实,但python在越多越来的领域都有广泛应用,比如科学计算 、web服务器等。程序员当然也希望python能够运算得更快,希望python可以更强大。

首先,python相比其他语言具体有多慢,这个不同场景和测试用例,结果肯定是不一样的。这个网址给出了不同语言在各种case下的性能对比,这一页是python3和C++的对比,下面是两个case:

从上图可以看出,不同的case,python比C++慢了几倍到几十倍。

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%。感兴趣的读者可以去细读。

推荐课程:Python机器学习(Mooc礼欣、嵩天教授)