我将使用我的示例:我想使用Eratosthenes筛子创建一个素数列表。对于每个数字,我都会检查它是否为复合数字,如果不是,则将其附加到列表中。
使用“标准”编程:
primes = [2]
start = time.time()
for i in xrange(3,primeRange,2):
isPrime = True
for p in primes:
if(i % p == 0):
isPrime = False
break;
if(isPrime):
primes.append(i)
print "Using C++-style: ", time.time() - start, " seconds"
使用reduce
功能:
start = time.time()
for i in xrange(3,primeRange,2):
if(reduce(lambda x,y:x and y,[i % p != 0 for p in primes])):
primes.append(i)
print "Using map-reduce: ", time.time() - start, " seconds"
结果为primeRange = 100000
:
Using map-reduce: 54.1150000095 seconds
Using C++-style: 4.62000012398 seconds
第二种情况使代码更紧凑,但是条件将针对整个列表进行评估,然后减小为True
/ False
。有办法避免这种情况吗?
您可以使用all
生成器表达式:
if all(i % p != 0 for p in primes)
生成器表达式每次将懒惰地求值一个项,all
如果它遇到不满足条件的值,则将提早返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句