Главное улучшение, которое я вижу, состоит в том, чтобы сломаться, как только вы обнаружите, что текущий элемент похож на некоторый элемент уже в вашем наборе.Это позволяет упростить ваш код, даже устраняя необходимость в дополнительной проверке первого элемента.
dataset = [a,b,c,d,e,f,g,...] #an example sorted dataset. real size is 20K
subset = [] #my diverse set. Desired size is 200
for candidate in dataset:
for member in subset:
if compute_similarity(candidate, member):
break
else:
subset.append(candidate)
if len(subset) >= 200:
break
Обратите внимание на конструкцию for-else, которая выполняет ветвь else, только если for-цикл не прервался.
Любая другая оптимизация будет зависеть от вашего фактического показателя сходства.Может быть, вы можете каким-то образом отсортировать данные, тем самым уменьшая количество необходимых сравнений.