2015-01-31 2 views
-1

Я хочу проверить элементы чрезвычайно длинного (более миллиарда элементов) генератора для свойства. Очевидно, что невозможно проверить все элементы (это займет примерно 400 лет). В настоящее время они производятся по заказу. Для того, чтобы небольшой образец, который у меня будет время, чтобы проверить, чтобы быть более представительным из всего, я хотел бы получить доступ к генератору случайным образом.Рандомизировать генератор

Есть ли способ сделать это (как изменить его на list и делать random.shuffle невозможно)?

Я пытаюсь выбрать случайную выборку из itertools.combinations результата большого входного набора:

itertools.combinations(a_large_set, 3) 
+4

Вы можете сделать генератор произвести детали в случайном порядке? Что вы на самом деле делаете с миллиардом элементов? Если вы дадите нам дополнительную информацию, мы сможем предоставить дополнительную помощь. Другим подходом было бы взять первые N элементов из генератора и выбрать случайное подмножество M из тех, которые будут проверены для свойства (при условии, что проверка свойства намного дороже, чем создание элементов в первую очередь). –

+0

@TomDalton Я проверяю элементы, чтобы увидеть, есть ли у них определенный признак. Это гораздо более дорогая операция, чем что-либо еще в программе. Если все остальное не работает, я попытаюсь заставить генератор производить элементы в произвольном порядке. – rlms

+1

Какой у вас генератор? Возможно, существует * другой подход. –

ответ

1

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

Если вы производите комбинации 3-х элементов из большого списка, а затем просто выбрать образцы 3:

def random_combinations_sample(lst, element_count, sample_size): 
    result = set() 
    while len(result) < sample_size: 
     indices = random.sample(xrange(len(lst)), element_count) 
     sample = tuple(lst[i] for i in sorted(indices)) 
     result.add(sample) 
    return list(result) 

Там нет необходимости производить все возможные комбинации, если требуется только случайный набор комбинации. Подобно itertools.combinations(), элементы выбираются в том порядке, в котором они отображаются во входном списке.

Вместо:

random.sample(itertools.combinations(a_large_set, 3), 10) 

вы бы использовать

random_combinations_sample(a_large_set, 3, 10) 
1

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

No.

+2

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

Смежные вопросы