当前位置: 首页 > 后端技术 > Python

Python从1-N计算素数(N可以是任意数)(并行计算,多线程优化计算)

时间:2023-03-26 16:07:14 Python

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,统计计算20万以内的素数已经是一眨眼眨眼之间。2.6优化5——数学角度优化进一步细化数学概念,看是否有优化空间。我的想法是,像15、33、39等这样的数叫做合数,合数是由两个质数相乘得到的结果,只需要计算一半就可以消去。同样可以看出,这个条件对其他数字也适用;相当于去掉了一半的计算量,一定程度上提高了效率。修改后的代码如下:运行情况如下:当然是0.329552s,已经很详细了,数学层面不想深究,但是如果用到一些密集计算的概念Python,我看看它能不能帮我的项目继续“提速”下去!2.7优化6——多线程优化接下来用学习到的多线程基础来测试新的两个判断素数的代码。修改后的代码如下:运行结果如下:似乎实现了多线程计算的简单使用“1的突破”又向前迈进了一步,但是代码还有待完善,以及需要更严谨一些,但基本可以肯定的是,多线程的启动已经远远超过了原来的源码,代码优化的任务也在一定意义上实现了。!但仍需加深理解,进一步学习!2.8优化7——jit技术优化实现pypy的jit技术耗时0.296242秒,比之前的所有优化都好,已经很强大了。2.9优化8-Pythoncache缓存优化使用Pythoncache缓存,并添加装饰器。第一次调用时,正常执行,计算结果缓存。使用同样的参数,第二次调用的时候,不执行,直接加载计算结果0.303995,速度比原来的3有很大的提升。总结经过三周的学习,我学会了如何使用Numpy,Numba,多线程从类、集群和队列优化代码,也知道如何使用cProfile查看代码的内存操作和可视化输出。这四个星期虽然内容很多,但是通过不断的尝试和实验,终于熟悉了,也明白了高阶程序员是如何优化算法的,熟练掌握了它的原理,总的来说受益匪浅。4.附文件下载地址Python从1-N计算质数(N可以是任意数)(并行计算,多线程优化计算)