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条以上的检索速度,也欢迎熟悉易语言的朋友们提出意见和建议。