NebulaDun

导航

Python高性能编程

前言

python现在已经被广泛使用了,它效率高,平常做一些简单的实验,处理一些数据都可以使用python。
我写这篇文章的目的,是想和大家分享下提升python性能的小技巧,这些技巧在工作和学习中算是非常实用了。接下来文字和简明扼要,直接告诉大家如何高性能使用python,不会涉及到基础知识没比如元组和列表的区别等,需要读者有一定的python基础和算法基础。

列表和元组的选择

他俩的区别我就不再赘述,就使用情况来看,列表是动态的,元组是静态的,想必大家都很喜欢使用列表吧。
但是因为列表的超额分配,列表会占用额外的内存的空间,而且初始化列表的时间大约是初始化元组的5倍,因此给大家的建议是,凡是需要存储不会改变的事物,就是用元组吧,或者是说只要在适用的情况下,能用元组就用元组。

迭代器和生成器

迭代器和生成器算是python的一大特色了,迭代器和生成器可以简单理解为,需要迭代的内容不需要全部在内存中,只有在迭代完一个的时候才去生成另外一个。所以,迭代器和生成器一大好处就是节省内存。举个例子,统计10GB文本中单词的个数,显然不能把10GB文件都读到内存中,那么我们可以写如下代码:

with open("test.txt","r") as fr:
    # 千万不要写成 data = fr.readlines(),这样就全部读到内存中了
    for line in fr:
        pass # 统计这一行单词的个数

上面的例子非常简单,只是用来告诉大家这么一个思想,只要会yielditer基本就能应付日常工作了。

大规模矩阵运算

这一小节可能更适合从事机器学习工作的人。如果你需要进行大规模的矩阵计算,比如计算5万个向量和另外5万个向量的余弦值,请使用numpy库,一个高效的矩阵运算库,凡是需要进行大规模矩阵运算和矢量计算,用numpy就对了。 numpy也是很多使用技巧的,比如尽可能对矩阵使用就地操作来节省内存,即:arr1 += arr2而不是arr1 = arr1 + arr2

多进程

大家都知道因为全局锁的原因,python无法真正并行,不过我们可以使用多进程模块multiprocessing来实现多进程,直接看代码吧:

import random
import time
from multiprocessing import Pool
def f(x1,x2):
    time.sleep(random.randint(3,15))
    return x1+x2

    
    
if __name__ == "__main__":
    pool = Pool(4)
    res = []
    for i in range(6):
        res.append(pool.apply_async(f,args=(i,i)))
    pool.close()
    pool.join()
    res = [i.get() for i in res]
    print(res)

其它小技巧

  1. 高效迭代字典,请使用for k,v in dict.items()
  2. 高效连接大量字符串,请使用join函数
  3. 需要频繁判断某个元素是否在集合里,请使用字典或者set
  4. 能用python内置函数就要用,效率会更高一些,比如filter函数
  5. 多使用局部变量,局部变量检索更快,尽量少使用global关键字
  6. 迭代pandas的dataframe时,使用df.itertuples()会快很多
  7. 无限循环使用while 1
  8. 善于去找各种高效的第三方包,python的包真的非常多,当自己当算写一个复杂的功能时,先去搜索一下有没有类似的包

总结

上面基本是我工作中常用到小技巧,python的优点主要是可快速上手和测试结果,可以用来快速验证想法,真正去把想法去作为一个工程实现,还是要用java等语言。

posted on 2019-11-16 16:27  NebulaDun  阅读(783)  评论(1编辑  收藏  举报