У меня была такая же проблема, и я не нашел способа исправить ее с помощью Python. Python - медленный язык, если вы не можете найти умный способ использовать библиотеки. Поскольку вы уже пробовали Numba и Cython, вы исчерпали большинство доступных вариантов в этой области.
Я решил свою проблему, переключив языки на использование JuMP Джулии . Джулия не всегда работала хорошо для меня (я обычно могу получить значительный прирост скорости, переключаясь на C ++), но оказалась идеальной для этой проблемы: представление было все еще на высоком уровне, но производительность была намного лучше чем Python.
Быстрый пример:
using JuMP
using Cbc
lpModel = Model(solver = CbcSolver(seconds = 3600))
@variable(lpModel, x >= 5)
@variable(lpModel, y >= 6)
@constraint(lpModel, x+y == 18)
@constraint(lpModel, 20x + 30y <= 470)
@objective(lpModel, Max, 2x + 3y)
status = JuMP.solve(lpModel)
println("Number of Tea Cups: $(getvalue(x))")
println("Number of Coffee Mugs : $(getvalue(y))")