内存越大python越快吗_python - 为什么pow(a,d,n)比** d%n快得多? - 堆栈内存溢出...

我试图实施Miller-Rabin素性测试 ,并且很困惑为什么中等数字(~7位数)需要这么长时间(> 20秒)。 我最终发现以下代码行是问题的根源:

x = a**d % n

(其中a , d和n都是相似的,但不相等,中等数字, **是取幂运算符, %是模运算符)

然后我尝试用以下内容替换它:

x = pow(a, d, n)

相比之下它几乎是瞬间完成的。

对于上下文,这是原始函数:

from random import randint

def primalityTest(n, k):

if n < 2:

return False

if n % 2 == 0:

return False

s = 0

d = n - 1

while d % 2 == 0:

s += 1

d >>= 1

for i in range(k):

rand = randint(2, n - 2)

x = rand**d % n # offending line

if x == 1 or x == n - 1:

continue

for r in range(s):

toReturn = True

x = pow(x, 2, n)

if x == 1:

return False

if x == n - 1:

toReturn = False

break

if toReturn:

return False

return True

print(primalityTest(2700643,1))

示例定时计算:

from timeit import timeit

a = 2505626

d = 1520321

n = 2700643

def testA():

print(a**d % n)

def testB():

print(pow(a, d, n))

print("time: %(time)fs" % {"time":timeit("testA()", setup="from __main__ import testA", number=1)})

print("time: %(time)fs" % {"time":timeit("testB()", setup="from __main__ import testB", number=1)})

输出(使用PyPy 1.9.0运行):

2642565

time: 23.785543s

2642565

time: 0.000030s

输出(使用Python 3.3.0运行,2.7.2返回非常相似的时间):

2642565

time: 14.426975s

2642565

time: 0.000021s

还有一个相关的问题,为什么这个计算在运行Python 2或3时几乎是PyPy的两倍,而PyPy通常要快得多 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值