Very good question / problem. Generally, this problem seems to belong to the class of problems where Compile
is the best choice if maximum efficiency is looked for, since it is, by its nature, not a good fit for the Mathematica paradigm of working with lots of data at once. However, your last solution can be, in a somewhat modified form, brought to the same performance level while only partly compiled:
Clear[split, thresholdSemiCompiled];
split = Compile[{{nums, _Real, 1}},
FoldList[If[# > 1, 0, #] &[#1 + #2] &, 0.0, nums],
CompilationTarget -> "C"];
thresholdSemiCompiled[l_List] :=
Flatten@Differences[SparseArray[Unitize[split[l]] - 1]["NonzeroPositions"]]
It turns out that Clip
was a major bottleneck in the compiled split
, and once I replaced it with If
, it became an order of magnitude faster. This one is on par with your fastest fully compiled solution, in terms of performance.