如何在Python 2.7中加速Mersenne素数py
我希望在Python2.7中优化和加速这个py,它可以查找梅森素数,过滤非梅森素数,过滤偶数。数字2不起作用,但没关系。代码在26秒内找到M44497。在更快的CPU上,它可以在15秒内找到它。它在7.5小时内找到了M859433。我怎么能说让M44497在7秒内运行,只是希望你们知道如何在Python 2.7中加速Mersenne素数py,python,Python,我希望在Python2.7中优化和加速这个py,它可以查找梅森素数,过滤非梅森素数,过滤偶数。数字2不起作用,但没关系。代码在26秒内找到M44497。在更快的CPU上,它可以在15秒内找到它。它在7.5小时内找到了M859433。我怎么能说让M44497在7秒内运行,只是希望你们知道 import time def myfunction(): myfunction() def prime_sieve(): yield 2; yield 3;
import time
def myfunction():
myfunction()
def prime_sieve():
yield 2; yield 3; yield 5; yield 7;
def mod_mersenne(n, prime, mersenne_prime):
while n > mersenne_prime:
n = (n & mersenne_prime) + (n >> prime)
if n== mersenne_prime:
return 0
return n
def is_mersenne_prime(prime, mersenne_prime):
s = 4
for i in range(prime - 2):
s = mod_mersenne((s*s - 2), prime, mersenne_prime)
return s == 0
def calculate_perfects(n):
primes = prime_sieve()
next(primes)
if is_mersenne_prime(n,(2**n - 1) ):
yield((2**n-1 ))
print ("Mersenne Determinate Program Tom O'Neil, The Program only prints Mersenne
Primes and it filters non-mersenne primes and even numbers. The number 2 returns
nothing!")
def runpro():
keep_running = True
num = int(input('Enter a number to test: '))
while keep_running:
start = time.time()
for perfect in calculate_perfects(num):
print ((True))
elapsed = time.time() - start
print "\tfound in %.f seconds" % elapsed
start = time.time()
num = int(input('Enter a number to test: '))
if num == 0:
keep_running = False
runpro()
您可以使用gmpy2,我创建了一个同时执行这两种功能的程序,您可以看到gmpy2可以在2秒钟内解决它:
def makersmarknongmpy2(n):
z = 9
mask = (1<<n)-1
def mer_rem(x, bits):
# Below is same as: return x % mask
while True:
r = 0
while x != 0:
r += x & mask
x >>= bits
if r == mask:
r = 0
if r < mask:
return r
x = r
for x in range(n-1):
z = mer_rem(z * z, n)
return z == 9
import gmpy2
def makersmark(n):
z = 9
mask = gmpy2.mpz((1<<n)-1)
def mer_rem(x, bits):
# Below is same as: return x % mask
while True:
r = gmpy2.mpz(0)
while x != 0:
r += x & mask
x >>= bits
if r == mask:
r = gmpy2.mpz(0)
if r < mask:
return r
x = r
z = gmpy2.mpz(z)
n = gmpy2.mpz(n)
for x in range(n-1):
z = mer_rem(z * z, n)
return z == 9
start = time.time()
print(makersmark(44497)
end = time.time()
print(end-start)
True
2.0241031646728516
start = time.time()
print(makersmarknongmpy2(44497)
end = time.time()
print(end-start)
True
16.902064561843872
def MakerMarkNongMPY2(n):
z=9
掩码=(1=位)
如果r==掩码:
r=0
如果r<掩码:
返回r
x=r
对于范围(n-1)内的x:
z=mer_rem(z*z,n)
返回z==9
进口gmpy2
def制造商标记(n):
z=9
掩码=gmpy2.mpz((1=位
如果r==掩码:
r=gmpy2.mpz(0)
如果r<掩码:
返回r
x=r
z=gmpy2.mpz(z)
n=gmpy2.mpz(n)
对于范围(n-1)内的x:
z=mer_rem(z*z,n)
返回z==9
开始=时间。时间()
打印(makersmark(44497)
end=time.time()
打印(结束-开始)
真的
2.0241031646728516
开始=时间。时间()
打印(MakerMarkNongMPY2(44497)
end=time.time()
打印(结束-开始)
真的
16.902064561843872
使用Python以外的语言是速度的最佳选择:它会慢慢地处理那些while循环,朱丽亚可能是一种替代解释语言的好选择。你也可以查看Python NUBBA JIT编译器,或者Cython。嗨,李察和Tip,Cython的这个脚本。我相信我需要一个C++编译器和Pip安装cython。任何帮助都会很好。:)我相信如果你在Google上搜索,StackOverflow会有很多关于运行cython的问题和答案。很难遵循你发布的代码(请正确缩进),但它可能有助于缓存/记忆计算结果。例如,看一看,关于优化或重构代码的问题更适合。