Tenía la esperanza de que la nueva scipy.optimize.linear_sum_assignment
sería más rápido, pero (quizás no es sorprendente) el Cython library (que no tiene el apoyo pip) es significativamente más rápido, al menos para mi caso de uso:
$ 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 vio resultados similares para tamaños entre 2x2 y 100x120 (10-40x más rápido).
Qué pena que no se llevó a cabo con numpy. No solo podría ser más rápido, sino que también el algoritmo debe ser mucho más fácil de expresar con numpy. – u0b34a0f6ae