Python 3.x 重复序列(优化)

Python 3.x 重复序列(优化),python-3.x,list,optimization,Python 3.x,List,Optimization,我试图解决这个问题: 初始列表=[0,1,2,2] 得到这个数字序列[0,1,2,2],每次需要将下一个自然数(3,4,5等)n次相加,其中n是其索引的元素。例如,下一个要添加的数字是3,而列表[3]是2,因此要追加[3]2次。新列表将是:[0,1,2,2,3,3]。那么4的索引是3,所以必须追加4三次。列表将是[0、1、2、2、3、3、4、4、4]等等。([0,1,2,2,3,3,4,4,4,5,5,6,6,6,7,7,7,8,8,9,9,9,10,10,10]) 为了解决这个问题,我尝试了各

我试图解决这个问题: 初始列表=[0,1,2,2] 得到这个数字序列[0,1,2,2],每次需要将下一个自然数(3,4,5等)n次相加,其中n是其索引的元素。例如,下一个要添加的数字是3,而列表[3]是2,因此要追加[3]2次。新列表将是:[0,1,2,2,3,3]。那么4的索引是3,所以必须追加4三次。列表将是[0、1、2、2、3、3、4、4、4]等等。([0,1,2,2,3,3,4,4,4,5,5,6,6,6,7,7,7,8,8,9,9,9,10,10,10])

为了解决这个问题,我尝试了各种方法。我使用了递归,但在这种情况下,递归方法非常慢。我也试过OEIS的数学公式(A055086)=>a(n)=天花板(2*sqrt(n+1))-2。这个公式的问题是,在2**20之后,它太不精确了

所以,我的下一个想法是使用备忘录:

lst = [0, 1, 2, 2]
from itertools import repeat
def find(n):
    global lst
    print(lst[-1], n, flush = True)
    if len(lst) > n:
        return lst[n]
    for number in range(lst[-1]+1, n+1):
        lst += list(repeat(number, lst[number]))
        if len(lst) > n:
            return lst[n]
现在,这种方法一直工作到2**37,但在这之后只是超时。我尝试实现算法的站点是()。我不要求解决方案,但要求任何关于如何优化我的代码的提示。 我在谷歌上搜索了一些类似的问题,发现在这种情况下,我可以使用列表的总和,但我还不太清楚这对我有什么帮助


欢迎任何帮助

您可以这样反复回答:

def find(n):
    lst = [0,1,2,2]
    if n < 4:
        return lst[n]
    to_add = 3
    while n >= len(lst):
        for i in range(lst[to_add]):
            lst.append(to_add)
        to_add += 1
    return lst[n]
def find(n):
lst=[0,1,2,2]
如果n<4:
返回lst[n]
加起来等于3
当n>=len(lst)时:
对于范围内的i(lst[添加]):
第一个附加项(添加到)
加上+=1
返回lst[n]

您可以在
for
循环中提前中断,并单独跟踪列表长度,而不是调用
len

来优化大n,谢谢您的建议!当然,我会记住这一点,我没想过。这样做会更快,但还不够快。