Единственный способ улучшить алгоритм «для каждого многоугольника» - это создать набор метаданных, которые позволят вам пропустить некоторые многоугольники.Например, если для ваших тысяч полигонов у вас есть список или набор списков всех полигонов, которые перекрывают друг друга, то вы сможете быстро устранить множество сравнений точек-полигонов.Т.е. найдите первый многоугольник, который содержит точку, затем сравните только те многоугольники, которые пересекают / перекрывают этот исходный многоугольник, потому что любой многоугольник, содержащий точку, также должен перекрывать какой-то другой многоугольник, который ее содержит.Наихудшим случаем будет N сравнений, например, ваше для каждой реализации.
Вы также можете создавать логические / физические области многоугольников, такие как, например, квадранты, многоугольников в определенной области.В примере с квадрантом вы можете / должны иметь возможность удалить 3/4 полигонов для сравнения.Это все зависит от того, как устроены ваши полигоны.
Но в любом случае, я думаю, что улучшение алгоритма для каждого заключается в создании / организации некоторых логических групп в вашей коллекции многоугольников.