这次的题目有点挑战
最短时间内,最小内存消耗
我们在coding时候,经常做的是完成,而不是完美,有机会挑战一下自己的极限也是好事。
原题在这里
def is_prime(num):
print(num)
res = False
i= 2
j = 2
if num <2 :
return False
x = num** 0.5 + 0.1
while i < x :
# while i < num ** 0.5 +0.1
# while i < num//j + 0.1 :
if num % i == 0:
return False
j = i
i +=1
# print(i)
res = True
return True
思路
大家应该都理解,挨个除就可以了,实际操作中,把小于被除数的所有数字除一遍效率是最低的
while i < num:
下面是4个不同的微调,用来减少循环的次数
1
while i < num//2 + 0.1 :
这个语句将数字除以 2 后,截止循环【一个数不可能被大于自己1/2的数字整除】
将原来的循环次数降到 50%
执行500个数字后,还是会超过12000ms
2
while i < num//j + 0.1 :
j +=1
这个语句不止除以 2 随着循环次数增加,缩减的范围也在加速
循环次数降到很低,10000会降到100次循环以内
执行500个数字后,大概花费了4400ms
3
while i < num ** 0.5 +0.1
这个语句是从网上看的,使用开方来划定边界,如100的开方结果是10,我们最多试到 10 就可以找出是否是质数
这样边界效率降低的更快,而且语句更简洁
奇怪的是执行时间反而上升了
同样的500个数字来测试,执行时间上升到了4900ms
思考后,重新查询while 语句执行语序,发现while条件是每次循环都判断的,而且开方比 + - X 和除 更消耗资源,再次调整后
是最终能想到的最简方案
4
将开放放置到 循环外,这样再执行
效率最高,4000ms
x = num** 0.5 + 0.1
while i < x :
总结
重新了解了while执行语序,执行效率,包括内存使用、各个性能消耗的知识。
同时也在循环逻辑上进行重新思考。