To generate a random int
between 0 and 10 in Python, I could do any of the following:
import numpy as np
print(np.random.randint(0, 10))
or
import random
print(random.randint(0, 10))
How do these two methods differ, computationally?
It's important to note that these function are not equivalent. In numpy, the range is [low, high)
, and in the Python random [low, high]
.
Speed
It seems that the numpy implementation is the fastest:
In [1]: import numpy as np
In [2]: %timeit np.random.randint(0, 10)
1000000 loops, best of 3: 206 ns per loop
In [3]: import random
In [4]: %timeit random.randint(0, 10)
1000000 loops, best of 3: 1.5 µs per loop
Randomness
The randomness seems to be the same. One can test the randomness using ent
For this script
import numpy as np
import sys
for _ in range(1000000):
sys.stdout.write(str(np.random.randint(0, 10)))
the partial output of the command python file.py | ent -c
is
Value Char Occurrences Fraction
48 0 100360 0.100360
49 1 100157 0.100157
50 2 99958 0.099958
51 3 100359 0.100359
52 4 100287 0.100287
53 5 100022 0.100022
54 6 99909 0.099909
55 7 99143 0.099143
56 8 100119 0.100119
57 9 99686 0.099686
Total: 1000000 1.000000
Entropy = 3.321919 bits per byte.
And for this script
import random
import sys
for _ in range(1000000):
sys.stdout.write(str(random.randint(0, 9)))
the partial output of the command python file.py | ent -c
is
Value Char Occurrences Fraction
48 0 100372 0.100372
49 1 100491 0.100491
50 2 98988 0.098988
51 3 100557 0.100557
52 4 100227 0.100227
53 5 100004 0.100004
54 6 99520 0.099520
55 7 100148 0.100148
56 8 99736 0.099736
57 9 99957 0.099957
Total: 1000000 1.000000
Entropy = 3.321913 bits per byte.