rust-itertools / itertools

Extra iterator adaptors, iterator methods, free functions, and macros.
https://docs.rs/itertools/
Apache License 2.0
2.72k stars 309 forks source link

`Powerset::fold` specialization #765

Closed Philippe-Cholet closed 1 year ago

Philippe-Cholet commented 1 year ago

Related to #755

Rank Description powerset_0_fold (µs) powerset_1_fold (µs) powerset_2_fold (µs) powerset_4_fold (µs) powerset_8_fold (µs) powerset_12_fold (µs)
3 no specialization [321.26 322.12 323.18] [395.73 396.62 397.61] [353.65 355.59 357.87] [333.72 334.66 335.72] [321.30 321.79 322.31] [318.88 319.67 320.71]
1 wins currently [312.58 312.94 313.29] [375.18 375.65 376.12] [330.77 331.83 332.96] [298.66 299.17 299.72] [289.46 289.81 290.18] [289.31 289.68 290.16]
2 With (k+1..=n).fold [320.78 322.00 323.43] [383.65 384.39 385.30] [349.08 350.11 351.12] [315.60 316.55 317.63] [304.82 305.70 306.59] [296.88 297.81 299.03]

So it's 10% faster than without specialization for powerset_{4,8,12}_fold (and 3% to 7% for n=0,1,2). And (it.k() + 1..=it.n()).fold makes it (intermediary) slower (so it's not pushed here).

Once Combinations::fold is implemented, it should be even faster.

EDIT: Sorry, the table does not render well.