python中2,000,000以下的素数之和

2023-12-05

我正在尝试欧拉计划的第 10 题,即 2,000,000 以下所有素数的总和。我尝试过使用 Python 实现埃拉斯托坦筛法,我编写的代码对于 10,000 以下的数字非常有效。

然而,当我尝试求更大数字的素数之和时,代码运行时间太长(求 100,000 以内的素数之和需要 315 秒)。该算法显然需要优化。

是的,我看过该网站上的其他帖子,例如列出 N 以下所有素数的最快方法,但是那里的解决方案对代码如何工作的解释很少(我仍然是初学者程序员),所以我无法真正从中学习。

有人可以帮助我优化我的代码,并清楚地解释它是如何工作的吗?

这是我的代码:

primes_below_number = 2000000 # number to find summation of all primes below number
numbers = (range(1, primes_below_number + 1, 2)) # creates a list excluding even numbers
pos = 0 # index position
sum_of_primes = 0 # total sum
number = numbers[pos]
while number < primes_below_number and pos < len(numbers) - 1:
    pos += 1
    number = numbers[pos] # moves to next prime in list numbers
    sum_of_primes += number # adds prime to total sum
    num = number
    while num < primes_below_number:
        num += number
        if num in numbers[:]:
            numbers.remove(num) # removes multiples of prime found

print sum_of_primes + 2

正如我之前所说,我是编程新手,因此对任何复杂概念的彻底解释将不胜感激。谢谢。


正如您所看到的,有多种方法可以在 Python 中实现埃拉斯托滕筛法,这些方法比您的代码更有效。我不想用花哨的代码让您感到困惑,但我可以展示如何加快您的代码的速度。

首先,搜索列表并不快,从列表中删除元素甚至更慢。然而,Python 提供了一个集合类型,它在执行这两个操作时非常有效(尽管它确实比简单列表消耗更多的 RAM)。令人高兴的是,可以轻松修改代码以使用集合而不是列表。

另一个优化是我们不必一直检查素因数primes_below_number,我已将其重命名为hi在下面的代码中。只需求平方根就足够了hi,因为如果一个数是合数,则它的因数必须小于或等于其平方根。

我们不需要保存素数之和的运行总和。最好最后使用 Python 的内置函数来完成此操作sum()函数以 C 速度运行,因此它比以 Python 速度逐一进行加法要快得多。

# number to find summation of all primes below number
hi = 2000000

# create a set excluding even numbers
numbers = set(xrange(3, hi + 1, 2)) 

for number in xrange(3, int(hi ** 0.5) + 1):
    if number not in numbers:
        #number must have been removed because it has a prime factor
        continue

    num = number
    while num < hi:
        num += number
        if num in numbers:
            # Remove multiples of prime found
            numbers.remove(num)

print 2 + sum(numbers)

您应该会发现这段代码在几秒钟内运行;在我的 2GHz 单核机器上大约需要 5 秒。

您会注意到我已经移动了评论,以便它们位于正在评论的行上方。这是 Python 中的首选样式,因为我们更喜欢短行,而且内联注释往往会使代码看起来混乱。

还有一个可以对内部进行的小优化while循环,但我让你自己弄清楚。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中2,000,000以下的素数之和 的相关文章

随机推荐

  • Swift:设置 rootViewController 不起作用?

    我正在尝试启动一个新的 Swift 项目 这是我第一次尝试以编程方式创建视图 然而 我的控制器看起来根本没有被加载 我所看到的只是启动屏幕 然后当我将其加载到模拟器上时出现黑屏 这是我的 AppDelegate import UIKit U
  • 带有 TypeScript 错误的 Angular HTTP GET http.get(...).map 不是 [null] 中的函数

    我在 Angular 中遇到 HTTP 问题 我只想GET a JSON列出并在视图中显示它 服务等级 import Injectable from angular2 core import Hall from hall import Ht
  • ReactJS 中的页面转换和组件动画

    我想要的效果 当页面加载组件 A B 和 C 时独立启动动画 用户单击组件 B 内的链接 组件 A B 和 C 独立启动 加载新页面 更多组件呈现动画 这听起来很简单 但我正在努力实现它 到目前为止 我已经使用了许多路线设置react ro
  • C++11 获取 unordered_map 中一个存储桶的所有项目

    we know std unordered map bucketreturn 桶是容器内部哈希表中的一个槽 元素根据其键的哈希值分配到其中 如何在返回桶中获取开始迭代器和结束迭代器 换句话说 我可以使用bucket count要获取桶的数量
  • 如何使用Ant任务启动和停止jboss服务器?

    我需要停止 部署我的ear 文件并使用Ant 任务启动Jboss 服务器 我能够使用 Ant 任务成功地编译 构建 J2EE 应用程序并将其作为 Ear 文件部署到 JBoss 服务器中 我们可以在 jboss 控制台中看到我的应用程序的重
  • 雅虎在从 smtpclient .net 发送时禁用链接

    我正在构建一个发送电子邮件的网络应用程序SmtpClient在 net中 应用程序工作正常 电子邮件成功发送到gmail帐户和hotmail帐户 但是当我向雅虎帐户发送电子邮件时 它已成功发送 但我在邮件中放入的链接被雅虎禁用 雅虎以某种方
  • 如何更改 Google 地图标记的颜色? [复制]

    这个问题在这里已经有答案了 我正在使用 Google 地图 API 构建一张充满标记的地图 但我希望一个标记能够从其他标记中脱颖而出 我认为最简单的方法是将标记的颜色更改为蓝色 而不是红色 这是一件简单的事情还是我必须以某种方式创建一个全新
  • 如何从谷歌表格的应用程序脚本中的过滤行中提取单个数组值

    我正在尝试从在应用程序脚本中过滤的 Google Sheets 行中提取单个数组值 我已根据列中空单元格的条件成功过滤数据 行 但现在 我不断收到以下错误 TypeError Cannot read property 0 of undefi
  • 让 Proguard 完全忽略包

    是否可以启用 Proguard 但保持某些类完全不受 Proguard 影响 我的 proguard 配置文件中有以下几行 keep class com heyzap 但正如我所看到的 Heyzap 包中的类实际上在 Proguard 通过
  • Python:datetime tzinfo 时区名称文档

    我有一个我建立的日期 from datetime import datetime from datetime import tzinfo test 2013 03 27 23 05 test2 datetime strptime test
  • 谷歌翻译排除单词

    我的网站上有谷歌翻译 我想阻止翻译某些单词和短语 是否可以创建一些非翻译单词和单词组合的列表 唯一的可能性是添加class notranslate 不应该翻译的元素 要防止整个网站被翻译 请添加
  • 具有复制构造函数、简单赋值运算符和简单析构函数的动态大小的文本对象

    I ve 已显示 that a std string无法插入到boost lockfree queue boost lockfree queue太有价值了 不能放弃 所以我想我可以使用非常大的固定长度chars 根据以下方式传递数据要求 假
  • 如何重用 ListView 的方法?

    我想重用 ListAC ListActivity 中的几个方法 并希望将其放入单独的类中 如果可能的话 我将有数十个 ListView 活动 ListActivities 即 ListAD ListTCDS listSFAR 等 它们将调用
  • 在没有任何库的情况下测试数字是否具有十进制值[重复]

    这个问题在这里已经有答案了 我需要测试一个数字在 C 中是否有十进制值 我只想用
  • .bat - 从文件夹文件列表创建菜单

    我通常不创建 bat 文件 但我使这个小脚本对开发有用 我用它来读取和创建文件夹中包含的文件列表 for f delims f in dir b C src release android do echo f 我发现这是关于如何从文件列表开
  • ALTER TABLE 添加复合主键

    我有一张桌子叫provider 我有三列称为person place thing 可以有重复的人 重复的地点和重复的事物 但永远不会有重复的人 地 物组合 我将如何 ALTER TABLE 为 MySQL 中的该表添加这三列的复合主键 AL
  • 为什么有些程序员声明像我的 $myvariable = shift; 这样的变量?在 Perl 中?

    我一直在关注 perlmeme org 上的教程 一些作者通过以下方式声明变量 my num disks shift 9 no idea what the shift does 并在循环内像 my source shift my dest
  • 在 Javascript 中使用 new Array 创建二维数组 [重复]

    这个问题在这里已经有答案了 我正在尝试 Hackerrank 上的一个问题 我需要创建一个数组的数组 基本上是二维数组 我的首选班轮是const counter new Array 4 fill 然而 我意识到它会创建一个二维数组 但对数组
  • 用 JS 数组表示不确定大小的二维空间 - 负索引?

    我想在 2d JS 数组中表示 2d 笛卡尔坐标 二维空间的大小不确定 也可以扩展到 x 和 y 空间 这对于正 x 和 y 值来说很好 但是在 JS 数组中最小索引为 0 时 我无法扩展到负 x 和 y 空间 我读过一些关于在 JS 中使
  • python中2,000,000以下的素数之和

    我正在尝试欧拉计划的第 10 题 即 2 000 000 以下所有素数的总和 我尝试过使用 Python 实现埃拉斯托坦筛法 我编写的代码对于 10 000 以下的数字非常有效 然而 当我尝试求更大数字的素数之和时 代码运行时间太长 求 1