我对同一功能有两种不同的看法:
def is_prime(number):
for denominator in range(2, number):
if denominator ** 2 > number:
return True
if number % denominator == 0:
return False
return True
和
def is_prime(number):
denominator = 2
while denominator ** 2 <= number:
if number % denominator == 0:
return False
denominator += 1
return True
第一个代码块用于测试前10个** 5个数字大约需要30秒才能完成,第二个代码大约需要350毫秒。两种测试用例的答案都相同。
为什么性能会有如此大的差异?
注意:这个古怪是由于ctypes导入的测试性能而引起的,我知道range(math.sqrt(number))更快,我们可以使用Fermat的小定理来使其更快。
答案 0 :(得分:3)
确实,代码段1有更多指令要执行,但是两个if
语句只会使if语句的执行时间加倍(我在这里只使用 )。您的大部分速度都在for
循环中丢失:
python -m timeit -s 'i=0' 'for x in range(1000): i+=1'
10000 loops, best of 3: 46.4 usec per loop
python -m timeit -s 'i=0' 'while i<1000: i+=1'
10000 loops, best of 3: 0.0299 usec per loop
您在for
循环中失去了多个数量级,因此if
语句相对无关紧要:
python -m timeit -s 'x=1; y=4' 'x<y'
10000000 loops, best of 3: 0.0256 usec per loop
但是,我要指出的是python3的range
和python2的xrange
就是这种情况。如果您使用的是python2的range
(如@jdowner所指出的那样),则会提前生成整个数字列表