当stop值大于sys.maxsize时,itertool.islice值错误

时间:2017-11-20 00:02:51

标签: python python-3.x generator long-integer itertools

itertools.islice()方法允许我从给定值开始生成charset中的字符组合。使用Generate(1, 7, "abcde", "bdca")运行我的方法将运行得很好。

然而,当整数处于最大值时,'值(大于2147483647)我得到错误:

  

ValueError:islice()的索引必须为None或整数:0< = x< = sys.maxsize。

如何让itertools.islice获取较大的起始值?

我确实尝试将sys.maxsize设置为'一个大数字'并明确地将startValue转换为整数; sys.maxsize = (len(charset) ** maxVal),但islice()忽略了这一点。

这是我到目前为止提出的代码:

def checkValue(charset, word):
    pos = len(charset)
    value = 0
    for i,c in enumerate(reversed(word)):
        value+= (pos**i) * charset.index(c)
    return value

def Generate(minVal, maxVal, charset, startFrom):
    startValue = int(checkValue(charset, startFrom))
    print(startValue)
    allCombos = itertools.product(charset, repeat=len(startFrom))
    combos = itertools.islice(allCombos, int(startValue), None) # error is here with 'startValue'
    # generate from combo to end of length
    for num, attempt in enumerate(combos, start=startValue):
        generated = "".join(attempt)
        print(num, generated)
    # have to make new instance or skips a chunk for each length
    for length in range(minVal + 1, maxVal + 1):
        to_attempt = itertools.product(charset, repeat=length)
        for attempt in to_attempt:
            generated = "".join(attempt)
            print(generated)

Generate(1, 15, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ADHkjdWCE")

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是islice的实现细节,如果不手动重新实现,则无法直接解决。

如果你转向64位版本的Python,sys.maxsize将从2**31 - 1跳转到2**63 - 1,这是如此之大,以至于实际上耗尽了长时间不会发生的切片。任何人类合理的时间。

注意:这里的设计是个坏主意。 islice不是魔术;它仍然必须耗尽(丢弃结果)才能到达startValue。这样做20多亿次需要很长时间。我建议找一种方法直接在以后开始迭代,而不是从头开始并丢弃20亿个项目。