首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的Euler 50项目

Python中的Euler 50项目
EN

Code Review用户
提问于 2015-05-02 17:37:35
回答 2查看 2K关注 0票数 6

Euler项目,问题#50

素数41,可以写成六个连续素数之和: 41 =2+3+5+7+ 11 + 13这是相加在100以下的素数的最长和。在一千以下的连续素数的最长和,加到一个素数,包含21个项,等于953。哪一个素数,低于一百万,可以写成最连续素数之和?

我想出了这个代码,但它只适用于一万以下的素数。

对如何优化它有什么想法吗?

代码语言:javascript
运行
复制
from pyprimes import *

def sequence_exists(l,ls,limit = 100):
    for x in range(0,len(ls)-l):
        if x+l > len(ls): return False
        if any (ls[i] > limit/6 for i in range(x,x+l,1)) :
            return False
        test_sum = sum(ls[x:x+l:1])
        if (test_sum <limit) and is_prime(test_sum) :
            return True
    return False

def main():
    n = prime_count(10000)
    prime_list = list(nprimes(n))
    l = 6
    for x in range(6,len(prime_list)):
        if sequence_exists(x,prime_list,10000):
            l=x
    print l

if __name__ == '__main__':
    main()
EN

回答 2

Code Review用户

发布于 2015-05-02 18:42:15

不要导入“通配符”

特别是如果模块不是标准库的一部分,人们就会感到困惑,也不明白该功能来自何处。您可以按以下方式减少键入:

代码语言:javascript
运行
复制
 import pyprimes as pr

使用较长的名称

代码语言:javascript
运行
复制
def sequence_exists(l,ls,limit = 100):

在上面的lls中,什么都不告诉读者。

票数 3
EN

Code Review用户

发布于 2015-05-03 08:50:07

对如何优化它有什么想法吗?

我不打算包含很多细节,因为这是一个Euler项目的问题,我不想透露太多。然而,这里有一些可能会帮助你的想法。

  • 您正在寻找指定某一条件的最大数字。您的程序在一组数字上运行一个迭代循环来测试条件。你的循环从哪里开始?你怎么能改变它来更快地找到答案呢?对于数据和问题陈述,你能做什么假设来集中你的搜索?
  • 您可以使用is_prime函数来测试计算出的素数求和。您没有向我们展示实现,但这肯定不是最优的。最低限度,您可以内联它并消除函数调用的开销(并且您正在进行大量的此调用)。但是,抛开开销不谈,几乎可以肯定有一个更好的方法来测试原始性。而不是像米勒拉宾表演每个候选人,有没有一些简单的,就地检查,你可以代替,看看你的候选人是否是已知的一组素数的一部分?你怎么能有效地构造这样的检查?
  • 有很多不必要的重新计算。最大的违法者包括在亚诺斯的回答中,但也有一些小的,例如素数列表的长度和limit/6
  • 第一代:您正在计算10000以下的素数,然后生成多个素数(希望按顺序排列)。早期的Euler问题应该会使您开发出一种有效的方法来筛选出一个给定数字以下的素数。你应该这么做。如果你没有做过早期的问题,我鼓励你去尝试它们;后面的问题建立在完成早期问题所获得的知识的基础上。

作为参考,我的python 3对这个问题的回答在一台质量较差的笔记本电脑上不到半秒钟就完成了,而且不使用预先计算的总和。我们的算法之间的巨大差异就是上面所暗示的。

风格

  • 点名。就像其他两个答案说的,这是至关重要的。您的代码令人困惑,很难理解。局部变量名称通常没有意义。
  • 间距和行距不一致。选择一个会议,并坚持它。优选地,在比较运算符之间添加空格,并且总是在条件项之后包括行中断。它非常有助于可读性。我个人也非常喜欢函数参数之间的空格。不一致的例子:
    • if x+l > len(ls): return False
    • if (test_sum <limit) and is_prime(test_sum) : return True

  • 在创建范围或切片时,如果从0开始或使用1的步骤大小,则不需要声明它。您甚至已经这样做了(另一个不一致的例子):
    • for i in range(x,x+l,1)
    • for x in range(6,len(prime_list)):

  • 神奇数字。10000是什么意思?为什么是那样的价值而不是其他的东西?在开始时用描述性名称声明一个变量,然后设置它。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/88645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档