首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python itertools.combinations()的超时问题

Python itertools.combinations()的超时问题
EN

Stack Overflow用户
提问于 2017-03-16 23:45:29
回答 1查看 395关注 0票数 0

我们有一个使用itertools.combinations()的脚本,它似乎因输入过大而挂起。

我是一个相对缺乏经验的Python程序员,所以我不确定如何解决这个问题。有没有更合适的库?或者,是否有一种方法可以启用详细日志记录,以便我可以调试方法调用挂起的原因?

任何帮助都是非常感谢的。

编辑

代码语言:javascript
复制
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 = []
EN

回答 1

Stack Overflow用户

发布于 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的转换中也没有日志记录。如果需要,您可以在自己的紧凑循环中实现日志记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42838749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档