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 # 统计这一行单词的个数
上面的例子非常简单,只是用来告诉大家这么一个思想,只要会yield和iter基本就能应付日常工作了。
大规模矩阵运算
这一小节可能更适合从事机器学习工作的人。如果你需要进行大规模的矩阵计算,比如计算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)
其它小技巧
- 高效迭代字典,请使用for k,v in dict.items()
- 高效连接大量字符串,请使用join函数
- 需要频繁判断某个元素是否在集合里,请使用字典或者set
- 能用python内置函数就要用,效率会更高一些,比如filter函数
- 多使用局部变量,局部变量检索更快,尽量少使用global关键字
- 迭代pandas的dataframe时,使用df.itertuples()会快很多
- 无限循环使用while 1
- 善于去找各种高效的第三方包,python的包真的非常多,当自己当算写一个复杂的功能时,先去搜索一下有没有类似的包
总结
上面基本是我工作中常用到小技巧,python的优点主要是可快速上手和测试结果,可以用来快速验证想法,真正去把想法去作为一个工程实现,还是要用java等语言。