random.shuffle очень медленно работает в Python 3 со списком - PullRequest
0 голосов
/ 19 ноября 2018

Я использую python-3.x, и я пытаюсь сгенерировать список номеров индексов и перетасовать их, чтобы потом использовать их для выбора случайных значений из выборки, где в этой выборке будет две переменные выборки размера и номера измерения,однако вот как я генерирую список индексов и их, я перетасовываю их:

dimension = 5
sample_size = 100

generate_indexes = itertools.combinations(range(sample_size),dimension)
all_indexes = list(generate_indexes)

# here I do the shuffle
random.shuffle(all_indexes)

проблема, когда я увеличил номер измерения, потребуется много времени, чтобы дать результат, даже если номер измерения равен 5занимает очень много времени или не будет продолжаться.

Есть ли способ сделать это быстро?

, потому что у меня есть многомерная выборка, которая содержит значения, и я хочу выбрать случайное число значений в формеэтот образец основан на all_indexes ...

1 Ответ

0 голосов
/ 19 ноября 2018

Как указано в комментариях, вы генерируете очень большой список и затем перетасовываете его. Это не будет быстрым, но в зависимости от того, что вам действительно нужно, могут быть более быстрые способы получить то, что вы хотите.

Я запустил ваш код на своей машине и обнаружил, что генерация списка всех комбинаций заняла около 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...