图零直播

图零科技告诉大家:python该如何实现性能优化

发布用户:tolink789 +收藏

发布时间:2018-05-07 13:12:12 已有22人浏览

 

今天图零小编来和大家聊聊python该如何实现性能优化,喜欢记得收藏。
当我们提到一门编程语言的效率时:通常有两层意思,一个是开发效率,这是对程序员而言,完成编码所需要的时间;另一个是运行效率,这是对计算机而言,完成计算任务所需要的时间。编码效率和运行效率往往是鱼与熊掌的关系,是很难同时兼顾的。

1. 交叉编译程序

开发者有时会忘记计算机不能识别任何一种现在应用程序语言,它只识别机器代码。为了运行程序,需要一个应用将人类可读的代码转换成计算机能识别的代码。当用一种语言写程序时,例如Python,然后用另外一种语言来运行它,例如C++,从性能角度看是有道理的。这个取决于你想要用这个应用做什么和主机系统能够提供什么资源。

一个有趣的交叉编译器,Nuitka, 能将Python转换成C++代码,结果是你可以再本机模式下执行应用,而不是依赖于解释器。根据平台和任务中,你可以看到显著的性能提高

2. 优化算法时间复杂度

算法的时间复杂度对程序的执行效率影响特别大,在 Python 中可以通过选择合适的数据结构来优化时间复杂度,如 list set 查找某一个元素的时间复杂度分别是O(n)O(1)。不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。

3. 减少冗余数据

如用上三角或下三角的方式去保存一个大的对称矩阵。在0元素占大多数的矩阵里使用稀疏矩阵表示。

4. 合理使用 copy deepcopy

对于 dict list 等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用 copy 包里的 copy deepcopy,这两个函数的不同之处在于后者是递归复制的。效率也不一样:(以下程序在 ipython 中运行)

import copy  

a = range(100000)  

%timeit -n 10 copy.copy(a) # 运行10 copy.copy(a)  

%timeit -n 10 copy.deepcopy(a)  

10 loops, best of 3: 1.55 ms per loop  

10 loops, best of 3: 151 ms per loop 

timeit 后面的-n表示运行的次数,后两行对应的是两个 timeit 的输出,下同。由此可见后者慢一个数量级。

5. 使用 dict set 查找元素

python dict set 都是使用 hash 表来实现(类似c++11标准库中unordered_map),查找元素的时间复杂度是O(1)

a = range(1000)  

s = set(a)  

d = dict((i,1) for i in a)  

%timeit -n 10000 100 in d 

%timeit -n 10000 100 in s10000 loops, best of 3: 43.5 ns per loop10000 loops, best of 3: 49.6 ns per loop 

dict 的效率略高(占用的空间也多一些)

图零科技欢迎你和我互动哦!关注图零直播微信公众号

点击菜单栏微我吧“Q我吧即可加我好友,与我更多互动!

 

 

 

 

 

  

 

 

 

 

        


上一篇:上海图零科技有限公司——安徽科技学院领导到访图零学院

下一篇:图零科技又与上海交通大学、华东师范大学达成学历合作项目

QQ咨询

微信咨询