如何优化数千次检查数千个列表元素?
How to optimize checking thousands of list elements thousands of times?
我正在尝试开发一个程序,通过“Collatz 猜想函数”运行 前 n 个整数,表示为“c(x)”,其中任何奇数更新为自身的三次加1,任何偶数都会更新为自身的一半,它会一直运行直到数字更新为 1。这只是一个编程练习。我不想用这个来证明任何事情。我只是想了解位操作等优化。
为了加快这个过程,我让它创建了一个列表,列出了它通过这个函数生成的每个唯一数字,如果它生成了一个之前生成的数字,那么它就会移动到下一个输入。但是,这会产生问题,每次再次运行该函数时,都会花费 负载 的时间来检查列表中的每个元素(称为“nums”)。
我使用的代码如下所示:
if x not in nums:
nums.append(int(x))
c(x)
有没有一种方法可以更快地检查此列表中的已生成号码?或者是否有一种完全不同的方式可以消除列表 and/or 完全检查每个元素的需要?一旦你开始超过 n = 100,000(意味着 100,000 个起始输入),检查列表需要明显更长的时间,并且任何优化都可以减少整个小时的计算更大的 n 值。
如果您将算法实现为递归函数,那么我建议查看 functools 函数 cache
(或 lru_cache
)。
如果您有一个处理密集型函数,这些装饰器将存储给定输入的结果,这样,如果稍后在同一进程中再次调用,该函数可以 return 先前计算的结果结果。对于高度递归的算法(如阶乘,在某种程度上,collatz),这可以节省大量时间。
就是说,如果您以递归方式实现算法,则可能会达到 Python 的递归限制。
我正在尝试开发一个程序,通过“Collatz 猜想函数”运行 前 n 个整数,表示为“c(x)”,其中任何奇数更新为自身的三次加1,任何偶数都会更新为自身的一半,它会一直运行直到数字更新为 1。这只是一个编程练习。我不想用这个来证明任何事情。我只是想了解位操作等优化。
为了加快这个过程,我让它创建了一个列表,列出了它通过这个函数生成的每个唯一数字,如果它生成了一个之前生成的数字,那么它就会移动到下一个输入。但是,这会产生问题,每次再次运行该函数时,都会花费 负载 的时间来检查列表中的每个元素(称为“nums”)。
我使用的代码如下所示:
if x not in nums:
nums.append(int(x))
c(x)
有没有一种方法可以更快地检查此列表中的已生成号码?或者是否有一种完全不同的方式可以消除列表 and/or 完全检查每个元素的需要?一旦你开始超过 n = 100,000(意味着 100,000 个起始输入),检查列表需要明显更长的时间,并且任何优化都可以减少整个小时的计算更大的 n 值。
如果您将算法实现为递归函数,那么我建议查看 functools 函数 cache
(或 lru_cache
)。
如果您有一个处理密集型函数,这些装饰器将存储给定输入的结果,这样,如果稍后在同一进程中再次调用,该函数可以 return 先前计算的结果结果。对于高度递归的算法(如阶乘,在某种程度上,collatz),这可以节省大量时间。
就是说,如果您以递归方式实现算法,则可能会达到 Python 的递归限制。