• 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等语言。

    事实是什么? 这些事实所证实的真理是什么? 永远不要让自己被自己所更愿意相信所影响, 只是单单地去审视, 什么才是事实.
  • 相关阅读:
    Centos7下安装pip
    Docker进入容器后使用ifconfig等命令“command not found”解决办法
    安装包安装npm
    grafna与饼状图
    Postgresql导出数据报版本不对
    添加动物欢迎语
    zabbix性能优化记
    CPU使用情况之平均负载
    centos7以rpm方法装mysql5.7及大坑
    光速搭lvs + keepalived + nginx
  • 原文地址:https://www.cnblogs.com/SuperDun/p/11872193.html
Copyright © 2020-2023  润新知