Как указано в комментариях, вы генерируете очень большой список и затем перетасовываете его. Это не будет быстрым, но в зависимости от того, что вам действительно нужно, могут быть более быстрые способы получить то, что вы хотите.
Я запустил ваш код на своей машине и обнаружил, что генерация списка всех комбинаций заняла около 8 секунд, а перестановка - около 75. Если вам нужно увеличить размерность, это время значительно увеличится, не говоря уже о требованиях к памяти хранения очень больших массивов может стать значительным.
Если вам не понадобятся все случайные индексы, вам, возможно, лучше выбирать каждый раз, используя
random.sample(range(sample_size), dimension)
Возвращает случайную коллекцию различных dimension
элементов от 0
до sample_size
. Это заняло около 0,0001 секунды для запуска с вашими значениями dimension
и sample_size
. Если вам не нужно слишком много случайных значений, вы будете гораздо быстрее (и эффективнее использовать память) генерировать новое значение каждый раз.
Есть две проблемы с этим, которые я могу видеть. Во-первых, вам не гарантируется, что каждый новый образец не будет повторять предыдущий, но это можно легко решить, сохранив их на ходу и проверив, использовались ли они уже.
new_sample = random.sample(range(sample_size), dimension)
if new_sample not in random_indexes:
random_indexes.append(new_sample)
else:
# Handle this however you need.
Это добавляет больше времени выполнения, но снова будет быстрее, если вам не нужно слишком много образцов.
Другое отличие состоит в том, что используемый вами подход генерирует кортежи элементов, которые всегда сортируются, поэтому (1,2,3,4,5) будет элементом all_indexes
, но (5,4,3, 2,1) не будет. Использование random.sample
может производить их в любом порядке, так что может произойти и другое. Если это проблема, вам придется ее решить. Возможно, поместив их в набор перед добавлением их в список:
new_sample = set(random.sample(range(sample_size), dimension))