快速验证生成的字符串(+数学)

时间:2018-08-11 12:03:01

标签: python

我正在尝试验证由itertools.permutations抽出的大量生成的字符串

我要验证它们的方式是检查是否在我设置的数组中找到每个重叠的2个字符,该字符串仅在每个重叠的2个字符串都在“路径”数组中时才有效

我有以下代码要验证:

def valid(s):
    matches = re.findall("(?=(..))", s)
    for match in matches:
       if match not in paths:
           return False
    return True

现在,我想知道是否可以加快速度,因为它太慢了,我认为使用非正则表达式解决方案会更快

我还想知道是否有可能预先计算出我将拥有多少个可接受的字符串,因为:paths数组中的每个字符都在itertools iterable *(因此键空间是已知的)中,并且“路径”数组也是已知的

编辑:路径目前有250种组合

这是可迭代的“ 1920eran876i3om54lstchdkgbvupywjfx”

有效输出示例:

1920876
1920873
1920875
1920874
1920867
1920863
1920865
1920864
1920834
1920857

2 个答案:

答案 0 :(得分:0)

如果paths是列表[],则将列表转换为集合set(){items}会更快,因为集合使用哈希表,因此您不需要不必遍历整个列表,如果您要查找的项目在末尾。

答案 1 :(得分:0)

您可以通过意识到您的正则表达式仅匹配每两个字符对来简化此操作。您可以通过压缩两个不同的迭代器来获得此代码,如下所示:

def valid(s):
    for c, d in zip(s[:-1], s[1:]):
       if c + d not in paths:
           return False
    return True

可能可以更快地遍历索引并在每个循环上使用切片,但是您必须对其进行测试。

我一直假设paths是一个字符串,但是如果它是Sequence[str],则可以将其设为set,以提高性能。

您可以通过手动编码Python字节码来进一步加快速度,但这可能有点多余。