[Tutor] lottery problem (Was Re: (no subject))
Peter Otten
__peter__ at web.de
Fri Dec 19 10:32:15 CET 2014
Adam Jensen wrote:
> Side note: if one were to only import specific functions from a module,
> would the load time and memory consumption be smaller? Example, is:
>
> from random import randint, seed
>
> smaller and faster than:
>
> import random
Basically
from random import randint, seed
is equivalent to
import random
randint = random.randint
seed = random.seed
del random
>From that you can deduce that the whole random module is loaded into memory
in both cases. A small speed advantage may be caused when the attribute
lookup is avoided in a tight loop
$ python3 -m timeit -s 'import random' 'random.randint'
10000000 loops, best of 3: 0.0925 usec per loop
$ python3 -m timeit -s 'from random import randint' 'randint'
10000000 loops, best of 3: 0.0356 usec per loop
but the actual randint() function call is so "heavy" that this speedup is
lost in the noise when you actually invoke the function:
$ python3 -m timeit -s 'from random import randint' 'randint(0, 42)'
100000 loops, best of 3: 3.73 usec per loop
$ python3 -m timeit -s 'import random' 'random.randint(0, 42)'
100000 loops, best of 3: 3.82 usec per loop
> Side side note: since 'i' isn't being used, is there a way to loop (within
> the list comprehension) without the 'i'? For example, to generate three
> random numbers:
>
> [randint(1,10) for i in range(3)] # This works.
> [randint(1,10) for range(3)] # This does not work.
No, but in numpy you can express it directly
numpy.random.randint(1, 10, 3)
or -- if you go back to the original problem -- with some effort:
>>> N = 3
>>> numpy.random.randint(1, 10, N) + numpy.arange(0, N*10, 10)
array([ 5, 11, 27])
In return the latter is likely significantly more efficient for large N than
the generic list comprehension.
More information about the Tutor
mailing list