我对同一功能有两种不同的看法:
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的小定理来使其更快。
最佳答案
虽然片段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所指出的那样),则会提前生成整个数字列表关于python - 为什么第二个代码段比第一个代码段运行得这么快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55936357/