如何使我的程序在Python中更高效

如何使我的程序在Python中更高效,python,Python,所以我必须做一个代码,生成第一个三角形数,它有超过500个因子。下面详细介绍了该问题: 三角形数序列是通过添加自然数生成的。所以第七个三角形的数字是1+2+3+4+5+6+7=28。前十个任期为: 1、3、6、10、15、21、28、36、45、55 让我们列出前七个三角形数字的系数: 1:1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 我们可以看到28是第一个有超过五个除数的三角形数 第一

所以我必须做一个代码,生成第一个三角形数,它有超过500个因子。下面详细介绍了该问题:

三角形数序列是通过添加自然数生成的。所以第七个三角形的数字是1+2+3+4+5+6+7=28。前十个任期为:

1、3、6、10、15、21、28、36、45、55

让我们列出前七个三角形数字的系数:

1:1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 我们可以看到28是第一个有超过五个除数的三角形数

第一个有500个以上除数的三角形数的值是多少

我已经写了一段代码,生成了相同的代码,但是效率很低;请提出一些改进方法。此外,它的效率非常低,只适用于70以下的数字

我的代码如下,请参考:

def生成的三角形数字最多为n(n):
列表=[1]
而len(list)int(n):
返回i
打印(主(100))
我在这个网站上看到一个问题,但我不明白它是如何工作的:

非常感谢

编辑1:感谢大家提出的精彩建议,在此基础上我改进了我的代码:

def干管(n): 列表=[1]
而返回\u number\u of \u n\u second(list[len(list)-1])只是一些基本的技术优化,它应该做到:

import time
import math


def main(n):
    last, length = 1, 1

    while return_number_of_n_second(last) <= n:
        length += 1
        last = int(length/2 * (length+1))

    return last


def return_number_of_n_second(n):
    sqrt = math.sqrt(n)
    if int(sqrt) == sqrt:
        return 2
    return sum(1 for i in range(2, math.ceil(sqrt)) if not n % i) * 2 + 2

start_time = time.time()
print(main(500))
print(time.time() - start_time)
导入时间
输入数学
def干管(n):
最后,长度=1,1

虽然返回第二(最后)秒的数量只是一些基本的技术优化,它应该做到:

import time
import math


def main(n):
    last, length = 1, 1

    while return_number_of_n_second(last) <= n:
        length += 1
        last = int(length/2 * (length+1))

    return last


def return_number_of_n_second(n):
    sqrt = math.sqrt(n)
    if int(sqrt) == sqrt:
        return 2
    return sum(1 for i in range(2, math.ceil(sqrt)) if not n % i) * 2 + 2

start_time = time.time()
print(main(500))
print(time.time() - start_time)
导入时间
输入数学
def干管(n):
最后,长度=1,1

虽然返回n秒(最后一秒)的n数,但您可能想看看它的可能重复项,当然这不是字面上的重复,但是如果您使代码中计算除数的部分有效,那么您的代码应该足够快。提示:
tri(n)=n(n+1)/2
,并且
n
n+1
没有公共因子,其中一个一定是平的。请注意,Euler项目不喜欢人们发布体育问题的解决方案,因此体育迷可能会对体育问题和答案投反对票。粗略地看一眼,你会不断地添加一个列表,使用deque可能会获得更好的结果。你可能想看看它的可能副本,当然,这不是字面上的重复,但是如果你让代码中计算除数的部分有效,那么你的代码应该足够快。提示:
tri(n)=n(n+1)/2
,和
n
n+1
没有公因子,其中一个必须是偶数。请注意,Euler项目不喜欢人们发布体育问题的解决方案,因此体育迷可能会对体育问题和答案投反对票,您可以使用DEQE获得更好的结果。在我的计算机上,原始响应:76576500 16.701260805130005优化后的一个:76576500 4.33 375 57 1800 23 19原谅我,但我不理解您的代码下面的11行(不包括空白行)。为什么你要写,如果物体是一个完美的正方形,那么返回2。根据这种逻辑,输入16(这是一个完美的平方)将导致输出2,这显然不是真的,因为16有5个因子(1,2,4,8,16)。请用适当的解释备份你的逻辑。在我的电脑上,原来的回答是:76576500 16.701260805130005,优化后的一个:76576500 4.33 375 57 1800,1919原谅我,但我不理解你的代码在11行(不包括空白行)。为什么你要写,如果物体是一个完美的正方形,那么返回2。根据这种逻辑,输入16(这是一个完美的平方)将导致输出2,这显然不是真的,因为16有5个因子(1,2,4,8,16)。请用适当的解释来支持你的逻辑。
import time
import math


def main(n):
    last, length = 1, 1

    while return_number_of_n_second(last) <= n:
        length += 1
        last = int(length/2 * (length+1))

    return last


def return_number_of_n_second(n):
    sqrt = math.sqrt(n)
    if int(sqrt) == sqrt:
        return 2
    return sum(1 for i in range(2, math.ceil(sqrt)) if not n % i) * 2 + 2

start_time = time.time()
print(main(500))
print(time.time() - start_time)