Самый быстрый способ получить случайное число от 1 до 1 миллиона в питоне - PullRequest
0 голосов
/ 11 июня 2018

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

С NumPy (среднее после 20 запусков 0,0001679009692429128)

t0 = time.clock()
print(np.random.randint(1,1000000))
t1 = time.clock()
print (t1-t0)

С произвольным (Avg: 0,0000920492372555262) ​​

t2 = time.clock()
print(random.choice(range(1,1000000)))
t3 = time.clock()
print (t3-t2)

К моему удивлению, случайный случай был последовательно быстрее, чем numpy.Есть ли более быстрый способ?

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Если вы используете numpy, более эффективно генерировать все нужные вам значения одновременно с помощью random.random_integers.И Python, и NumPy используют Mersenne Twister.Дополнительная информация: Различия между numpy.random и random.random в Python

0 голосов
/ 11 июня 2018

numpy более эффективен при генерации больших выборок (массивов) случайных чисел.Например,

In [10]: %timeit np.random.randint(1,1000000, 1000000)
5.14 ms ± 64.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [11]: %timeit [random.choice(range(1,1000000)) for _ in range(1000000)]
1.01 s ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Кроме того, см. Как рассчитать сегмент кода для тестирования производительности с помощью Pythons timeit? о том, как выполнять временные тесты.Когда вы используете time.clock(), вы должны хотя бы попытаться повторить операцию несколько раз, а затем вычислить среднее время.Более целесообразно использовать timeit для временных тестов.Кроме того, как уже упоминали другие в комментариях, print() занимает значительно больше времени, чем генерация случайных чисел, поэтому ваш тест времени в основном измеряет, как быстро работает print().Вместо этого вы должны сделать что-то вроде этого:

In [12]: repeat = 1000000
    ...: t0 = time.clock()
    ...: for _ in range(repeat):
    ...:     np.random.randint(1, 1000000)
    ...: t1 = time.clock()
    ...: print((t1 - t0) / repeat)
1.3564629999999908e-06

In [13]: repeat = 1000000
    ...: t2 = time.clock()
    ...: for _ in range(repeat):
    ...:     random.choice(range(1, 1000000))
    ...: t3 = time.clock()
    ...: print((t3 - t2) / repeat)
1.0206699999999956e-06

Итак, для одного числа numpy в среднем примерно на 35% медленнее, чем встроенный генератор случайных чисел.Однако предыдущие тесты показали, что при генерации больших выборок numpy значительно быстрее.

0 голосов
/ 11 июня 2018

Я написал тестовую программу.Это показало, что это займет всего 1 секунду, чтобы выполнить вашу задачу.Так что просто напишите, как хотите, это не будет вашим узким местом.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Xiang Wang @ 2018-05-23 16:49:00

import time
import random

start = time.time()

for i in range(1000000):
    random.randint(1, 1000000)

end = time.time()

print("total time: {}".format(end-start))

enter image description here

...