今天早些时候,我问是否有一种惯用的方法来计算Mathematica 中匹配谓词函数的元素,因为我关心的是性能。
我对给定谓词的初始方法pred
如下:
PredCount1[lst_, pred_] := Length@Select[lst, pred];
我有一个建议改为使用
PredCount2[lst_, pred_] := Count[lst, x_/;pred@x];
我开始分析这些函数,它们具有不同的lst
大小和pred
函数,并添加了另外两个定义:
PredCount3[lst_, pred_] := Count[Thread@pred@lst, True];
PredCount4[lst_, pred_] := Total[If[pred@#, 1, 0] & /@ lst];
我的数据样本范围在 1 到 1000 万个元素之间,我的测试函数是EvenQ
,#<5&
和PrimeQ
. 下图显示了所花费的时间。
偶数
PredCount2 最慢,3 和 4 决胜负。
比较谓词:#<5&
我选择了这个功能,因为它接近我在实际问题中所需要的。不要担心这是一个愚蠢的测试功能,它实际上证明了第四个功能有一些优点,我实际上最终在我的解决方案中使用了它。
与 相同EvenQ
,但 3 显然比 4 慢。
PrimeQ
这很奇怪。一切都颠倒了。我不怀疑缓存是这里的罪魁祸首,因为最差的值是最后计算的函数。
那么,计算列表中匹配给定谓词函数的元素数量的正确(最快)方法是什么?