Создать список случайных чисел в Python
Я хотел бы создать случайный список целых чисел для целей тестирования. Распределение чисел не имеет значения. Единственное, что считается-это времени. Я знаю, что генерация случайных чисел-это трудоемкая задача, но должен быть лучший способ.
вот мое текущее решение:
import random
import timeit
# Random lists from [0-999] interval
print [random.randint(0, 1000) for r in xrange(10)] # v1
print [random.choice([i for i in xrange(1000)]) for r in xrange(10)] # v2
# Measurement:
t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1
t2 = timeit.Timer('random.sample(range(1000), 10000)', 'import random') # v2
print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
v2 быстрее, чем v1, но он не работает в таком большом масштабе. Это дает следующую ошибку:
ValueError: выборка больше, чем население
есть ли быстрое, эффективное решение, которое работает в таком масштабе?
некоторые результаты из ответа
Эндрю: 0.000290962934494
gnibbler: в 0.0058455221653
KennyTM: в 0.00219276118279
NumPy пришел, увидел и победил.
4 ответов:
не совсем понятно, что вы хотите, но я хотел бы использовать numpy.случайность.randint:
import numpy.random as nprnd import timeit t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1 ### Change v2 so that it picks numbers in (0, 10000) and thus runs... t2 = timeit.Timer('random.sample(range(10000), 10000)', 'import random') # v2 t3 = timeit.Timer('nprnd.randint(1000, size=10000)', 'import numpy.random as nprnd') # v3 print t1.timeit(1000)/1000 print t2.timeit(1000)/1000 print t3.timeit(1000)/1000что дает на моей машине:
0.0233682730198 0.00781716918945 0.000147947072983обратите внимание, что randint составляет очень отличается от случайного.образец (чтобы он работал в вашем случае, мне пришлось изменить 1000 на 10 000, как указал один из комментаторов - если вы действительно хотите, чтобы они были от 0 до 1000, вы могли бы разделить на 10).
и если вам действительно все равно, что распределение, которое вы получаете, тогда возможно, что вы либо не очень хорошо понимаете свою проблему, либо случайные числа-с извинениями, если это звучит грубо...
все случайные методы в конечном итоге вызова
random.random()поэтому лучший способ-это вызвать его напрямую:[int(1000*random.random()) for i in xrange(10000)]например,
random.randintзвонкиrandom.randrange.random.randrangeимеет кучу накладных расходов, чтобы проверить диапазон перед возвращениемistart + istep*int(self.random() * n).NumPy намного быстрее, конечно.
ваш вопрос о производительности спорен-обе функции очень быстры. Скорость вашего кода будет определяться тем, что вы do со случайными числами.
однако важно, чтобы вы поняли разницу в поведение из этих двух функций. Один делает случайную выборку с заменой, другой делает случайную выборку без замены.
во-первых, вы должны использовать
randrange(0,1000)илиrandint(0,999), а неrandint(0,1000). Верхний пределrandintвключительно.для эффективного,
randint- это просто фантикrandrangeкоторых звонкиrandom, так что вы должны просто использоватьrandom. Кроме того, используйтеxrangeв качестве аргументаsample, а неrange.вы могли бы использовать
[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]для генерации 10 000 чисел в диапазоне с помощью
sample10 раз.(конечно, это не бить И NumPy.)
$ python2.7 -m timeit -s 'from random import randrange' '[randrange(1000) for _ in xrange(10000)]' 10 loops, best of 3: 26.1 msec per loop $ python2.7 -m timeit -s 'from random import sample' '[a%1000 for a in sample(xrange(10000),10000)]' 100 loops, best of 3: 18.4 msec per loop $ python2.7 -m timeit -s 'from random import random' '[int(1000*random()) for _ in xrange(10000)]' 100 loops, best of 3: 9.24 msec per loop $ python2.7 -m timeit -s 'from random import sample' '[a for a in sample(xrange(1000),1000) for _ in range(10000/1000)]' 100 loops, best of 3: 3.79 msec per loop $ python2.7 -m timeit -s 'from random import shuffle > def samplefull(x): > a = range(x) > shuffle(a) > return a' '[a for a in samplefull(1000) for _ in xrange(10000/1000)]' 100 loops, best of 3: 3.16 msec per loop $ python2.7 -m timeit -s 'from numpy.random import randint' 'randint(1000, size=10000)' 1000 loops, best of 3: 363 usec per loop
но, поскольку вы не заботитесь о распределении чисел, почему бы просто не использовать:
range(1000)*(10000/1000)?
Comments