我们有一个使用itertools.combinations()的脚本,它似乎因输入过大而挂起。
我是一个相对缺乏经验的Python程序员,所以我不确定如何解决这个问题。有没有更合适的库?或者,是否有一种方法可以启用详细日志记录,以便我可以调试方法调用挂起的原因?
任何帮助都是非常感谢的。
编辑
def findsubsets(S,m):
return set( itertools.combinations(S, m) )
for s in AllSearchTerms:
S.append(itemsize)
itemsize = itemsize + 1
for i in range (1,6):
Subset = findsubsets(S,i)
for sub in Subset:
for s in sub:
sublist.append(AllSearchTerms[s])
PComb.append(sublist)
sublist = []发布于 2017-03-17 00:36:43
你的代码中有两个东西会在大的输入大小时挂起。
首先,您的函数findsubsets调用itertools.combinations,然后将结果转换为集合。itertools.combinations的结果是一个生成器,每次生成一个组合,而不存储它们或一次性计算所有组合。当您将其转换为一个集合时,您强制Python一次计算并存储它们。因此,return set( itertools.combinations(S, m) )这一行几乎可以肯定是程序挂起的地方。您可以通过在该行之前和之后放置print语句(或其他类型的日志语句)来检查这一点,如果您看到前面的print,并且程序在您看到下一个之前挂起,那么您就发现了问题。解决方案不是将组合转换为集合。将其保留为生成器,您的程序可以根据需要一次获取一个组合。
其次,即使你按照我刚才的建议去做,你的循环for sub in Subset:也是一个相当紧凑的循环,它使用了所有的组合。如果输入的大小很大,该循环将花费很长的时间,并且实现我的上一段也没有帮助。您可能应该重新组织您的程序,以避免较大的输入大小,或者至少在该循环期间显示某种进度。组合的功能是has a predictable output size,因此您甚至可以在进度条中显示完成的百分比。
itertools.combinations内部没有日志记录,因为在正确使用时不需要它,并且在生成器到set的转换中也没有日志记录。如果需要,您可以在自己的紧凑循环中实现日志记录。
https://stackoverflow.com/questions/42838749
复制相似问题