Создать список случайных чисел в 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 пришел, увидел и победил.

712   4  

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 чисел в диапазоне с помощью sample 10 раз.

(конечно, это не бить И 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

    Ничего не найдено.