在易语言中使用六种方法实现1600万位π值搜索

2018年3月18日更新:

多线程的胜利!

一直在考虑如何能进一步提高检索速度,很自然想到了多线程。于是动手测试了一下。

一开始脑子进水了,方法是把π值表分成两部分,然后两个线程分别检查6位数字所有组合出现的情况。结果把事情搞得很复杂,因为还要考虑如果数字组合正好出现在被分割点附近怎么办,为此写了一堆的代码来避免这种情况出现。

后来清醒过来,把π值表在内存中拷贝成两个相同的变量,启动两个线程,一个检测变量1中的0~50万,另一个检测变量2中的500001到999999。这样两个线程分别同时以每秒600~700条的速度进行查找,相当于总速度提高到了1500条左右。

嗯,目前速度已经可以提高到10分钟左右,相信只要再按照这个思路继续增加线程,估计可以把时间压缩到几分钟之内。当然,线程太多也不行,毕竟cpu的计算资源极限在那里放的,这个是不能突破的。

应该说,当初的目标已经达到了。

2018年3月17日更新:

经过和易语言官方论坛上的朋友们讨论,目前使用一个名叫“极速文本操作模块”,使检索速度达到了700-800条每秒,应该说距离python的效率已经不是很远了。

除了这个极速文本操作模块,另外还测试了一种使用API进行检索的方式,所以把文章标题都改成“六种方法”了,但是很遗憾,API方式并没有什么突出的性能。

=========================

知乎上有这样一篇帖子:vortex:圆周率里包含你的银行卡密码吗?

看了以后,想用易语言来实现一下这个功能。

我用来生成π值的工具是SuperPi,最高可以生成3200万位的π值,不过速度较慢。但是由于原文中提到最多1400万位左右就能涵盖所有6位数字组合,所以我选择了倒数第二档,1600万位。

SuperPi生成的数据是10位一组,组和组之间有空格分隔,这样会导致检索出错,所以需要先对这个文件进行一下处理,删除所有空格,这个事情可以使用正则匹配来完成。

匹配空格的正则表达式是“\s+”,即一个或者多个空格

易语言实现代码比较简单:

原文件大概18m大,用这个方法处理空格,出乎意料的快,大概几秒钟就完成了。

下面就可以进行真正的检索了

我尝试了四种实现方法,分别是“寻找文本”、“正则匹配”、“快速文本”、“快速字节集”,发现最快的是“快速字节集”方法,大概每秒可以检索250个6位数字组合,这样全程下来需要大概1-2个小时;最慢的反倒是“正则匹配”,每秒只有几十个,也可能是我的代码写的有问题。

很遗憾经过尝试,始终无法达到原文中python的每秒1000条的速度。

这是快速字节集方法的核心代码:

完整代码可见这个链接:

我还在继续努力,希望能够找到一种方法,达到每秒1000条以上的检索速度,也欢迎熟悉易语言的朋友们提出意见和建议。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片