因为时机似乎相当重要。我已将各种方法之间的比较移至此,Community Wiki,答案。
使用的数据只是连续整数的列表,带有一个不连续的点,它们是通过生成的
d : dat[n_Integer?Positive] := (d = {1}~Join~Range[1, n])
d : dat[n_Integer?Positive, p_Integer?Positive] /; p <= n :=
Range[1, p]~Join~{p}~Join~Range[p + 1, n]
dat[n] 的第一种形式等同于dat[n, 1]。计时码很简单:
Clear[consQTiming]
Options[consQTiming] = {
NonConsecutivePoints -> {10, 25, 50, 100, 250,500, 1000}};
consQTiming[fcns__, OptionPattern[]]:=
With[{rnd = RandomInteger[{1, #}, 100]},
With[{fcn = #},
Timing[ fcn[dat[10000, #]] & /@ rnd ][[1]]/100
] & /@ {fcns}
] & /@ OptionValue[NonConsecutivePoints]
它会生成 100 个介于 1 和 {10, 25, 50, 100, 250, 500, 1000} 和 dat 之间的随机整数,然后将这些随机数中的每一个用作 10,000 个元素长的列表中的非连续点。然后将每个consQ 实现应用于dat 生成的每个列表,并对结果进行平均。绘图功能很简单
Clear[PlotConsQTimings]
Options[PlotConsQTimings] = {
NonConsecutivePoints -> {10, 25, 50, 100, 250, 500, 1000}};
PlotConsQTimings[timings : { _?VectorQ ..}, OptionPattern[]] :=
ListLogLogPlot[
Thread[{OptionValue[NonConsecutivePoints], #}] & /@ Transpose[timings],
Frame -> True, Joined -> True, PlotMarkers -> Automatic
]
我为consQSzabolcs1、consQSzabolcs2、consQBrett、consQRCollyer、consQBelisarius、consQWRFold、consQWRFold、consQWRFold2、consQWRFold3、consQWRMatch 和@987654@3 的以下函数计时987654352@.
从最左边的时序升序排列:consQBelisarius、consQWizard、consQRCollyer、consQBrett、consQSzabolcs1、consQWRMatch、consQSzabolcs2、consQWRFold2、consQWRFold3和@ 987654362@.
编辑:使用timeAvg(第二个)而不是consQTiming 中的Timing 重新运行所有函数。不过,我的平均跑步次数仍然超过 100 次。在大多数情况下,有任何变化,除了最低的两个在运行之间有一些变化。因此,请对这两行持保留态度,因为它们的时间实际上是相同的。