python 验证是否质数

这次的题目有点挑战
最短时间内,最小内存消耗
我们在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执行语序,执行效率,包括内存使用、各个性能消耗的知识。
同时也在循环逻辑上进行重新思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值