python - 计算素数的数量直到某个大值
问题描述
我写了这个超级简单的python代码来计算素数的数量,直到某个大的值。问题在于1e+8
程序需要花费大量时间这样的值,我想改进此代码以获得更快的结果和更好的性能。这是代码:
import math
def is_prime(num):
if num%2 ==0 and num>2:
return 0
for i in range(3, int(math.sqrt(num)) + 1, 2):
if num % i == 0:
return 0
return 1
def count_prime(num):
ct=0;
for i in range(2,num+1,1):
if is_prime(i)==1:
ct+=1
return ct
解决方案
正如评论中所建议的,您可以开始改进您的 is_prime()函数。尝试其他算法,例如建议的筛子或Miller Rabin 测试。我在密码学研讨会期间实施了后者,这并不难。(注意:该算法是一种概率算法,但不要太在意)。这可能会为您的主要检查带来更好的时间复杂度。
在此之后,您可能会考虑多次运行您的count_prime()函数。在这里,您可以存储运行中的值,并在下一次开始时从这一点开始。
例子:
- 在第一次运行中,您计算 n = 5000的所有素数。你得到一些结果 = x 你将 x 存储为 5000。
- 在第二次运行中,您可能输入10.000作为您的指定输入。现在您不需要从 2 重新开始,但是您可以从存储的结果开始并从 5001 继续计算。结果相加然后是 10.000 的结果
推荐阅读
- redis - Redis 作为 Modbus/TCP 的替代品
- treeview - Vuetify treeview - 选择父级而不选择子级
- python - 识别包含 Python 列表中字符串的数据框列的所有行的最有效方法?
- python - 有人可以帮我在 Django 中遇到属性错误吗?
- javascript - 在文本框中概述用户文本输入
- python - 使用 Python 从 url 下载 HTML 页面
- javascript - 在 JS 包中包含图片
- jenkins - 如何使用 groovy 脚本编辑特定的詹金斯作业?
- ms-access - 如何在未经许可的情况下向用户隐藏数据库后端的路径?
- mysql - 当记录跨越多个表时,在移动输入表单上创建格式良好的记录