提升Python程序运行效率的方法

2019-12-27  本文已影响0人  还是那个没头脑

代码优化技巧

1.字符串连接缓慢,不要在循环中执行,而是使用Python的join方法。

2.尽量不使用全局变量

3.尽量使用内建的字符串,元组,列表,集合,字典等容器

4.循环之外能做的事不要放在循环内。嵌套循环中,尽量减少内层循环的计算,尽可能向外提

5.对于and,应该把满足条件少的放在前面,对于or,把满足条件多的放在前面

6.使用 if is True 比 if == True 将近快一倍

7.并行编程:
因为GIL的存在,Python很难充分利用多核CPU的优势。但是可以通过内置的模块multiprocessing实现下面几种并行模式:
多进程:对于CPU密集型的程序,可以使用multiprocessing的Process,Pool等封装好的类,通过多进程的方式实现并行计算。但是因为进程中的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。
多线程:对于IO密集型的程序,multiprocessing.dummy模块使 multiprocessing的接口封装threading,使得多线程编程也变得非常轻松 (比如可以使用Pool的map接口,简洁高效 )。
分布式:multiprocessing中的Managers类提供了可以在不同进程之共享数据的方式,可以在此基础上开发出分布式的程序。

8.在循环的时候使用 xrange 而不是 range;使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range() 將直接返回完整的元素列表,用于循环时会有不必要的开销。python3 中取消了 range 函数,而把 xrange 函数重命名为 range,所以现在直接用 range 函数即可

9.if done is not None 比语句 if done != None 更快

10.使用级联比较 "x < y < z" 而不是 "x < y and y < z"

定位程序性能瓶颈

对代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,cProfile 与 hotshot 等。其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python 标准模块提供三种 profilers:cProfile,profile 以及 hotshot。

profile 的使用非常简单,只需要在使用之前进行 import 即可。具体实例如下:

import profile 
def profileTest(): 
   Total =1; 
   for i in range(10): 
       Total=Total*(i+1) 
       print Total 
   return Total 
if __name__ == "__main__": 
   profile.run("profileTest()")
性能分析结果

其中输出每列的具体解释如下:

对于 profile 的剖析数据,如果以二进制文件的时候保存结果的时候,可以通过 pstats 模块进行文本报表分析,它支持多种形式的报表输出,是文本界面下一个较为实用的工具。使用非常简单:

import pstats 
p = pstats.Stats('testprof') 
p.sort_stats("name").print_stats()

其中 sort_stats() 方法能够对剖分数据进行排序, 可以接受多个排序字段,如 sort_stats('name', 'file') 将首先按照函数名称进行排序,然后再按照文件名进行排序。常见的排序字段有 calls( 被调用的次数 ),time(函数内部运行时间),cumulative(运行的总时间)等。此外 pstats 也提供了命令行交互工具,执行 python – m pstats 后可以通过 help 了解更多使用方式。

对于大型应用程序,如果能够将性能分析的结果以图形的方式呈现,将会非常实用和直观,常见的可视化工具有 Gprof2Dot,visualpytune,KCacheGrind 等,读者可以自行查阅相关官网,本文不做详细讨论。

参考:
https://www.ibm.com/developerworks/cn/linux/l-cn-python-optim/

上一篇 下一篇

猜你喜欢

热点阅读