我在优化python上的递归时遇到了麻烦。所以我想在由10个元素组成的数组/列表中生成所有可能性,每个元素可以用0-9数字填充。 因此,我决定在这种情况下使用递归,这是:
routes = []
route = []
def generateRoutes(route, floor):
if floor >= 10:
routes.append(route)
else:
for channel in range(0, 10):
new_route=route.copy()
new_route.append(channel)
generateRoutes(new_route, floor + 1)
generateRoutes(route, 0)
我的代码需要永恒才能完成任务(更不用说要占用大量内存)。我的问题是,有没有办法解决/优化我的代码? (除了递归以外,我还开放其他方法)
编辑: 添加了有关函数调用方式的详细信息
答案 0 :(得分:5)
已经通过itertools
模块提供了一种非递归的惰性解决方案:
>>> import itertools
>>> routes = itertools.product(range(10), repeat=10)
当您遍历routes
时,每个值都是按需生成的,而不是一次将所有100亿个值存储在内存中。
>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 1), (0, 0, 0, 0, 0, 0, 0, 0, 0, 2), (0, 0, 0, 0, 0, 0, 0, 0, 0, 3), (0, 0, 0, 0, 0, 0, 0, 0, 0, 4), (0, 0, 0, 0, 0, 0, 0, 0, 0, 5), (0, 0, 0, 0, 0, 0, 0, 0, 0, 6), (0, 0, 0, 0, 0, 0, 0, 0, 0, 7), (0, 0, 0, 0, 0, 0, 0, 0, 0, 8), (0, 0, 0, 0, 0, 0, 0, 0, 0, 9), (0, 0, 0, 0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 0, 0, 0, 1, 1), (0, 0, 0, 0, 0, 0, 0, 0, 1, 2), (0, 0, 0, 0, 0, 0, 0, 0, 1, 3), (0, 0, 0, 0, 0, 0, 0, 0, 1, 4), (0, 0, 0, 0, 0, 0, 0, 0, 1, 5), (0, 0, 0, 0, 0, 0, 0, 0, 1, 6), (0, 0, 0, 0, 0, 0, 0, 0, 1, 7), (0, 0, 0, 0, 0, 0, 0, 0, 1, 8), (0, 0, 0, 0, 0, 0, 0, 0, 1, 9)]
>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 2, 0), (0, 0, 0, 0, 0, 0, 0, 0, 2, 1), (0, 0, 0, 0, 0, 0, 0, 0, 2, 2), (0, 0, 0, 0, 0, 0, 0, 0, 2, 3), (0, 0, 0, 0, 0, 0, 0, 0, 2, 4), (0, 0, 0, 0, 0, 0, 0, 0, 2, 5), (0, 0, 0, 0, 0, 0, 0, 0, 2, 6), (0, 0, 0, 0, 0, 0, 0, 0, 2, 7), (0, 0, 0, 0, 0, 0, 0, 0, 2, 8), (0, 0, 0, 0, 0, 0, 0, 0, 2, 9), (0, 0, 0, 0, 0, 0, 0, 0, 3, 0), (0, 0, 0, 0, 0, 0, 0, 0, 3, 1), (0, 0, 0, 0, 0, 0, 0, 0, 3, 2), (0, 0, 0, 0, 0, 0, 0, 0, 3, 3), (0, 0, 0, 0, 0, 0, 0, 0, 3, 4), (0, 0, 0, 0, 0, 0, 0, 0, 3, 5), (0, 0, 0, 0, 0, 0, 0, 0, 3, 6), (0, 0, 0, 0, 0, 0, 0, 0, 3, 7), (0, 0, 0, 0, 0, 0, 0, 0, 3, 8), (0, 0, 0, 0, 0, 0, 0, 0, 3, 9)]
答案 1 :(得分:1)
如果我正确理解了您的问题,那么itertools正是您想要的。 最可能是这样的:
import itertools
nums = list(range(0, 10))
routes = list(itertools.product(nums, LENGTH))
要解决内存问题,您应该考虑将其用作生成器:
import itertools
nums = list(range(0, 10))
for route in itertools.product(nums, LENGTH):
# YOUR_STUFF
如果您真的只想遍历数字,为什么不这样做
for i in range(10**LENGTH):
...
好吧,要找到更好的解决方案,我想我们需要有关您要实现的目标的更多信息,因为我觉得这种方法并不是您想要实现的最佳方法。