Combinatorics.jl icon indicating copy to clipboard operation
Combinatorics.jl copied to clipboard

`permutations` iteration regression in version 1.0.3

Open Drvi opened this issue 6 months ago • 1 comments

Hi! We noticed that the iterating permutations got significantly slower in 1.0.3 for large-ish inputs: 1.0.2

julia> ps = Combinatorics.permutations([i for i in 1:11])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 11)

julia> @time iterate(ps)
  0.000008 seconds (4 allocations: 464 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10])

julia> ps = Combinatorics.permutations([i for i in 1:12])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)

julia> @time iterate(ps)
  0.000005 seconds (4 allocations: 512 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 11])

1.0.3

julia> ps = Combinatorics.permutations([i for i in 1:11])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 11)

julia> @time iterate(ps)
  7.115521 seconds (3 allocations: 320 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

julia> ps = Combinatorics.permutations([i for i in 1:12])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 12)

julia> @time iterate(ps)
184.690355 seconds (3 allocations: 352 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

It would be great to have a permutations iterator that is as fast as the 1.0.2 version for larger inputs. Thank you!

Drvi avatar Jun 02 '25 13:06 Drvi

Hope pr #186 will fix this regression. Or revert #122

v1.0.2

julia> ps = Combinatorics.permutations([i for i in 1:11])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 11)

julia> @time iterate(ps)
  0.041737 seconds (107.14 k allocations: 5.476 MiB, 99.92% compilation time)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10])

julia> @time iterate(ps)
  0.000005 seconds (7 allocations: 464 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10])

julia> @time iterate(ps)
  0.000005 seconds (7 allocations: 464 bytes)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10])

master

julia> ps = Combinatorics.permutations([i for i in 1:11])
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 11)

julia> @time iterate(ps)
  0.140973 seconds (435.32 k allocations: 22.173 MiB, 99.89% compilation time)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], (mp = Combinatorics.MultiSetPermutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), mp_state = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10]))

julia> @time iterate(ps)
  0.000012 seconds (47 allocations: 3.188 KiB)
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], (mp = Combinatorics.MultiSetPermutations{Vector{Int64}}([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), mp_state = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10]))

inkydragon avatar Jun 07 '25 15:06 inkydragon

any updates?

Bumblebee00 avatar Aug 03 '25 17:08 Bumblebee00