Я надеялся, что новая scipy.optimize.linear_sum_assignment
будет быстрым, но (возможно, не удивительно) Cython library (который не имеет пип поддержки) значительно быстрее, по крайней мере, для моего случая использования:
$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)' 'a,b = linear_sum_assignment(c)'
100 loops, best of 3: 3.43 msec per loop
$ python -m timeit -s 'from munkres import munkres; import numpy as np; np.random.seed(0); c = np.random.rand(20,30)' 'a = munkres(c)'
10000 loops, best of 3: 139 usec per loop
$ python -m timeit -s 'from scipy.optimize import linear_sum_assignment; import numpy as np; np.random.seed(0);' 'c = np.random.rand(20,30); a,b = linear_sum_assignment(c)'
100 loops, best of 3: 3.01 msec per loop
$ python -m timeit -s 'from munkres import munkres; import numpy as np; np.random.seed(0)' 'c = np.random.rand(20,30); a = munkres(c)'
10000 loops, best of 3: 127 usec per loop
I видел аналогичные результаты для размеров от 2x2 до 100x120 (на 10-40 раз быстрее).
Какой позор, это не было реализовано с NumPy. Это может быть не только быстрее, но алгоритм должен быть намного проще выразить с помощью numpy. – u0b34a0f6ae