MatchQ
解压这些类型的测试。原因是没有实施这种特殊情况。原则上它could包含任何东西。
On["Packing"]
MatchQ[list, {x_Integer, y__}] // Timing
MatchQ[list, {x__Integer, y__}] // Timing
改进这一点非常棘手 - 如果你破坏了模式匹配器,你就会遇到严重的问题。
Edit 1:确实,拆包并不是 O(n^2) 复杂度的原因。然而,它确实表明对于MatchQ[list, {x__Integer, y__}]
代码的一部分转到算法的另一部分(需要解包列表)。其他一些需要注意的事情:只有当两种模式都存在时,这种复杂性才会出现__
如果其中任何一个是_
算法具有较好的复杂度。
然后该算法会遍历所有 n*n 个潜在匹配,并且似乎没有早期救助。大概是因为可以构造需要这种复杂性的其他模式 - 问题是上述模式迫使匹配器采用非常通用的算法。
那时我希望MatchQ[list, {Shortest[x__Integer], __}]
和朋友,但都无济于事。
所以,我的两分钱:要么使用不同的模式(并使用 On["Packing"] 来查看它是否进入通用匹配器),要么进行预检查DeveloperPackedArrayQ[expr] && Head[expr[[1]]]===Integer
或一些这样的。