[英]Why does set( ) make this code run so much faster?
我为Project Euler Problem 35编写了一些代码:
#Project Euler: Problem 35
import time
start = time.time()
def sieve_erat(n):
'''creates list of all primes < n'''
x = range(2,n)
b = 0
while x[b] < int(n ** 0.5) + 1:
x = filter(lambda y: y % x[b] != 0 or y == x[b], x)
b += 1
else:
return x
def circularPrimes(n):
'''returns # of circular primes below n'''
count = 0
primes = sieve_erat(n)
b = set(primes)
for prime in primes:
inc = 0
a = str(prime)
while inc < len(a):
if int(a) not in b:
break
a = a[-1] + a[0:len(a) - 1]
inc += 1
else:
count += 1
else:
return count
print circularPrimes(1000000)
elapsed = (time.time() - start)
print "Found in %s seconds" % elapsed
我想知道为什么当我在circularPrimes
函数中设置b = set(primes)
,此代码(以上)的运行速度如此之快。 该代码的运行时间约为8秒。 最初,我没有设置b = set(primes)
并且我的circularPrimes
函数是这样的:
def circularPrimes(n):
'''returns # of circular primes below n'''
count = 0
primes = sieve_erat(n)
for prime in primes:
inc = 0
a = str(prime)
while inc < len(a):
if int(a) not in primes:
break
a = a[-1] + a[0:len(a) - 1]
inc += 1
else:
count += 1
else:
return count
我的初始代码(没有b = set(primes)
)运行了很长时间,以至于我没有等待它完成。 我很好奇为什么在两段代码之间的运行时间上会有如此大的差异,因为我不认为primes
会有任何重复使得遍历整个代码花费的时间要长得多,因此遍历set(primes)
。 也许我对set()的想法是错误的。 欢迎任何帮助。
我相信这里的罪魁祸首是if int(a) not in b:
。 集在内部以哈希表的形式实现,这意味着检查成员资格比使用列表便宜得多(因为您只需要检查冲突)。
您可以在此处查看布景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.