1、我的项目介绍
1.1钻研背景
随着深度学习的高速倒退,大数据技术的遍及,只管大数据处理越来越风行,然而少不了本地python解决大量数据的场景,这时候单线程解决效率较低。接下来紧接的会遍及倒退的想必就是硬件层面的配合,而GPU无疑是最重要的趋势。
1.2题目介绍
并行计算与GPU编程的大作业我抉择的是质数运算方面的我的项目,通过Python实现查找N以内(N随便赋值)的质数个数的程序代码,因为质数统计运算始终是十分经典的问题,也通过这个问题深刻优化算法代码去践行“简化计算,提高效率”的准则,进一步地去探索Python运算能力的多样性以及便利性。
2.我的项目优化过程
2.1 源代码
依照质数的定义,我编写的源代码如下:
通过引入工夫模块定义并计算出程序的运行工夫,以此与前面的优化做出比照,这里我简略地跳过了while循环的应用,间接应用效率较快的for循环,以此用了嵌套for循环实现根本的N以内质数查找运算。(这里对立给N赋值为200000)
运算状况如下:
能够看出根本的一般算法的效率并不高,共计用时162.300478s,这样的查找效率着实使人抓狂,上面咱们对它进行优化。
2.2 优化1 - 数理的角度优化
我首先从数理的角度登程对代码进行优化,咱们晓得所有大于10的质数中,个位数只有1,3,7,9,加上这个排除条件之后效率又有所提高,这样能够进一步简化代码,咱们具体来看一下会有多少晋升。
批改后的代码如下:
运行状况如下:
果然退出了限度条件,是有点起步,绝对于源代码快了82s。
2.3 优化2 - 数理的角度优化
咱们持续从数理层面动手去欠缺代码!因为偶数除了2都不是质数,去除偶数相当于去掉一半运算量,效率进步差不多一半,这样代码能够进一步被优化,批改后的代码如下:
运行状况如下:
这外面通过运行工夫效率能够证实了咱们的推断,共计用时80.789876s,效率绝对于最后的源代码晋升了一半还多!比优化1快了近2s。
2.4 优化3 - 引入列表
合数肯定能够合成为几个质数的乘积;质数肯定不能整除1和自身之外的整数;用列表实现,批改后的代码如下:
运行状况如下:
引入了列表的概念进行优化,通过在质数表中去除合数,留下质数,这个速度曾经绝对于后面有了质的飞跃,工夫只用了13.643432s。所以Python外面的列表对于数据运算代码优化想比一般算法耗时都不是一个档次的。
2.5 优化4 - 退出列表后数理的角度优化
在引入列表后,咱们持续联合数理方面的概念,因为合数肯定能够合成为几个质数的乘积,质数肯定不能整除1和自身之外的整数,用列表实现代码,批改后的代码如下:
运行状况如下:
这里咱们能够看进去,当数理层面的优化联合相应的Python列表,这样的话只需0.607469s,二十万内的质数统计计算曾经是眨眨眼的功夫了。
2.6 优化5 - 数理的角度优化
进一步细化一下数理概念,看还有没有优化的空间,我的想法是例如像15、33、39等这样的数字被称为合数,合数是由两个质数相乘得出的所以只须要计算到一半就能够排除了,同理可知其余数字也实用这一条件;相当于去掉了一半的计算量,效率又肯定水平上进步了。
批改后的代码如下:
运行状况如下:
当然,0.329552s,这曾经非常粗疏了,在数理层面我也不想再深究上来,然而如果利用Python的一些密集计算的概念,看能不能帮忙我的我的项目持续“减速”上来!
2.7 优化6 - 多线程优化
接下来,使用学习到的多线程根底对这两个新的判断质数代码进行测试,批改的代码如下:
运行后果如下:
如同单纯利用多线程计算起来是不是实现了“1”的冲破,有迈步了一个台阶,然而代码仍须要改良,还须要更谨严一点,但根本必定多线程的起步曾经远远超过了最后的源代码,也肯定意义上实现了代码优化的工作!但还需加深了解,进一步学习!
2.8 优化7 - jit技术优化
用pypy的jit技术实现
用时0.296242秒,比之前所有的优化都要优良,曾经非常厉害了
2.9 优化8 - Python cache缓存优化
应用Python cache 缓存,给须要缓存的函数加一个润饰器。 第一次调用时,失常执行,并缓存计算结果。 应用雷同的参数,第二次调用时,不执行,间接加载计算结果
0.303995,速度比起原来的大幅晋升
3.总结
通过三周的学习,我从课上学会了如何应用Numpy、Numba、多线程、集群和队列等一系列伎俩对代码进行优化,还懂得了用cProfile来查看代码的内存运行状况以及可视化输入,尽管这周围的内容很多,但通过一直的尝试和试验,我最终还是熟稔于心,也明确了高阶程序员到底是如何优化算法的,对其原理也纯熟的进行了把握,总的来说受益匪浅。
4、附文件下载地址
Python 计算从1-N(N能够任何数)内的素数(并行计算、多线程优化计算)