投稿  收藏 
用多进程寻找相亲数

【问题描述】

如果有两个正整数a和b,a的所有除本身以外的因数之和等于b,b的所有除本身以外的因数之和等于a,则称a、b是一对相亲数。请输出200000以内的相亲数对。

用多进程寻找相亲数输出结果:

运行1次getamic_mp函数花费时间:2.1769893169403076秒

[(220,284),(1184,1210),(2620,2924),(5020,5564),(6232,6368),(10744,10856),(12285,14595),(17296,18416),(63020,76084),(66928,66992),(67095,71145),(69615,87633),(79750,88730),(100485,124155),(122265,139815),(122368,123152),(141664,153176),(142310,168730),(171856,176336),(176272,180848)]

备注:该程序运行在双核四线程的计算机上,同一算法采用单进程运算的时间大约是5.4秒。

【题前思考】

根据问题描述,填写表8-2-3。

表8-2-3 问题分析

用多进程寻找相亲数

【解题思路】

项目五中求相亲数的函数依赖于保存约数和的列表,这就意味着在程序执行过程中多个任务要共享这个列表,这就给并行操作带来了障碍。重新设计算法,让判断相亲数的过程不依赖于列表,而是对每个数单独计算,就可以让判断相亲数的操作互不干扰,使之易于多个进程并行执行。

【参考代码】

用多进程寻找相亲数

【代码分析】

①:定义函数amicable(n)求n的相亲数,如果n有相亲数,则返回元组(n,n的相亲数),反之返回none,这样就能分别判断每个数有没有相亲数而不会相互干扰。关于求整数m的约数之和的局部函数sumfactor(m)的更多内容参见项目五。

②:定义函数getamic_mp(a,b)以多进程的方式求a~b的相亲数。

③:创建进程数为cpu_count( )的进程池,命名为p,调用进程池的map( )方法以多进程的方式运行amicable( )函数,每次调用amicable( )函数的参数构成列表又作为参数传递给map( )方法,最后将各次函数调用的结果以列表的形式返回保存到变量res。

关 键 词

相亲数

相关教程

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!

猜你喜欢