鱼C论坛

 找回密码
 立即注册
查看: 2503|回复: 2

[技术交流] 用埃氏筛法筛选并输出前100w内的质数个数的两种不同的算法的性能差别

[复制链接]
发表于 2023-1-4 22:17:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不多废话,直接上代码
这个是比较快的版本,100w耗时0.07s


  1. from time import time

  2. def ess(n):
  3.     pl = [2]
  4.     Td = [True] * (n + 1)
  5.     for i in range(3, n + 1, 2):
  6.         if Td[i]:
  7.             pl.append(i)
  8.             for j in range(i ** 2, n + 1, i * 2):
  9.                 Td[j] = False
  10.     return pl

  11. if __name__ == "__main__":
  12.     t1 = time()
  13.     nei = 10 ** 6
  14.     pl = ess(nei)
  15.     t2 = time()
  16.     tt = t2 - t1
  17.     print("{}以内素数共{}个:".format(nei,len(pl)))
  18.     print("共耗时{}秒".format(tt))#0.7s
复制代码
这个是比较慢的版本,100w耗时0.10s

  1. from time import time

  2. def sieve(n):
  3.     prime = [True] * (n + 1)
  4.     p = 2
  5.     while (p * p <= n):
  6.         if (prime[p] == True):
  7.             for i in range(p * p, n+1, p):
  8.                 prime[i] = False
  9.         p += 1
  10.     for p in range(2, n):
  11.         if prime[p]:
  12.             pl.append(p)

  13. if __name__=='__main__':
  14.     pl=[]
  15.     n = 1000000
  16.     t1 = time()
  17.     sieve(n)
  18.     t2 = time()
  19.     tt = t2 - t1
  20.     print(n)
  21.     print("{}以内素数共{}个:".format(n,len(pl)))
  22.     print("共耗时",tt,"秒")#0.10s
复制代码
对算法理解比较深的朋友可以来探讨一下为什么两种相同的算法性能会有差别,怎么优化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-4 16:49:36 | 显示全部楼层
第一种i的步长为2(只计算奇数),第二种p的步长为1;第一种j的步长为2i,第二种i的步长为p。因此第一种更为高效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 17:16:21 | 显示全部楼层
from time import time

def sieve(n):
    prime = [True] * (n + 1)
    p = 3
    while (p * p <= n):
        if (prime[p] == True):
            for i in range(p * p, n+1, 2 * p):
                prime[i] = False
        p += 2
    for p in range(3, n, 2):
        if prime[p]:
            pl.append(p)

if __name__=='__main__':
    pl=[2]
    n = 1000000
    t1 = time()
    sieve(n)
    t2 = time()
    tt = t2 - t1
    print(n)
    print("{}以内素数共{}个:".format(n,len(pl)))
    print("共耗时",tt,"秒")#0.10s


这样改更快一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表