Профилировщик Вам в руки. Например:
python -m cProfile -s time z:\test.py > z:\profile.txt
Вот топ самых медленных мест:
ncalls tottime percall cumtime percall filename:lineno(function)
3188 0.609 0.000 1.730 0.001 test.py:71(suggest_coord)
39844 0.422 0.000 0.902 0.000 test.py:164(check_fit_score)
128340 0.223 0.000 0.223 0.000 test.py:254(get_cell)
67237 0.223 0.000 0.338 0.000 test.py:257(check_if_cell_clear)
3188 0.130 0.000 1.063 0.000 test.py:108(sort_coordlist)
64378 0.094 0.000 0.094 0.000 {method 'append' of 'list' objects}
34372/34369 0.052 0.000 0.052 0.000 {built-in method builtins.len}
108 0.034 0.000 0.062 0.001 test.py:23(clear_grid)
3188 0.032 0.000 1.827 0.001 test.py:123(fit_and_add)
3297 0.027 0.000 0.058 0.000 random.py:260(shuffle)
3299 0.023 0.000 0.035 0.000 {method 'sort' of 'list' objects}
2160 0.022 0.000 0.056 0.000 test.py:336(__init__)
1193 0.020 0.000 0.035 0.000 test.py:236(set_word)
Начинайте оптимизировать с самой верхней строки.
P.S. А вообще это кривой говнокод. Надо переписать заново с нуля.