从 match.clj
;; 重要注意:这个计算非常非常慢,
;; 我们应该更仔细地查看这个问题 - David
这与计算必要列有关,即包含我们将要进行匹配的最大数量的列。此补丁简化了这个逻辑,该逻辑分散在几个函数中,并将它放在一个地方。此外,它提高了复杂性。在计算列的必要性时,只需要计算列中包含通配符的模式。之前的实现方式是计算模式矩阵中每个条目的值,然后在每个条目上方检查是否存在通配符。现在,我们只需要按列分组,然后按列进行归约,累加与之前相同的值,并在遇到通配符时立即返回累加器,即(reduced acc)
。这避免了为每个条目重复遍历每一列。一个很好的好处是,单函数内部的所有内容都有一个邻域性。
我用bench.clj中的条目对这个进行了计时,并与master进行了比较,实际上有些惊讶地看到没有任何时间速度提升。