对于我的一个类,我最近遇到了使用miller-rabin算法来确定20到29000之间素数的ruby和python实现。我很好奇为什么即使它们看起来是相同的实现, python代码运行得非常快。我已经读过python通常比ruby更快,但速度差别有多大?为什么python实现miller-rabin的速度比ruby快很多?
miller_rabin.rb
def miller_rabin(m,k)
t = (m-1)/2;
s = 1;
while(t%2==0)
t/=2
s+=1
end
for r in (0...k)
b = 0
b = rand(m) while b==0
prime = false
y = (b**t) % m
if(y ==1)
prime = true
end
for i in (0...s)
if y == (m-1)
prime = true
break
else
y = (y*y) % m
end
end
if not prime
return false
end
end
return true
end
count = 0
for j in (20..29000)
if(j%2==1 and miller_rabin(j,2))
count+=1
end
end
puts count
miller_rabin.py:
import math
import random
def miller_rabin(m, k):
s=1
t = (m-1)/2
while t%2 == 0:
t /= 2
s += 1
for r in range(0,k):
rand_num = random.randint(1,m-1)
y = pow(rand_num, t, m)
prime = False
if (y == 1):
prime = True
for i in range(0,s):
if (y == m-1):
prime = True
break
else:
y = (y*y)%m
if not prime:
return False
return True
count = 0
for j in range(20,29001):
if j%2==1 and miller_rabin(j,2):
count+=1
print count
当我测量每个用测量命令在Windows PowerShell中的执行时间,我得到如下:
Python 2.7:
Ticks:4874403
总毫秒数:487.4403
的Ruby 1.9.3:
蜱:682232430
总毫秒:68223.243
我将不胜感激任何见解谁能给我到为什么他们是如此巨大的差异
我只是分析Ruby代码,看看是否显示任何东西。 – 2013-04-07 20:06:07
请注意,您应该在Python 2中将'range'更改为'xrange'。'range'不必要地*分配一个数字列表。 – user4815162342 2013-04-07 20:36:30