[Python] Chiarimento su random.randrange. e sulla documentazione.

Marco Giusti marco.giusti a posteo.de
Lun 13 Apr 2015 12:24:54 CEST


On Mon, Apr 13 2015, Gabriele Battaglia wrote:
> Buongiorno.
> nell'help di random.randrange leggo:
> 
> randrange(self, start, stop=None, step=1, _int=<type 'int'>,
> _maxwidth=9007199254740992L) method of random.Random instance
> 
> Che cosa significa, esattamente, _int=<type 'int'>
> 
> Potrei io chiamare la funzione assegnando a _int un tipo diverso:
> 
> random.randrange(1, 101, _int='float')
> 
> ed ottenere un valore casuale fra 1 e 100 ma in virgola mobile?
> 
> So che la risposta è no, ci ho provato... :) Allora come si
> interpreta l'indicazione _int=<type 'int'>, nell'aiuto?

Il nome dell'argomento inizia con un underscore e questo indica che il
parametro è privato. Questo può avere due ragioni:

1. per essere sicuri che "int" sia esattemente quello che ci si aspetta.
Per esempio puoi installare una tua versione della funzione che però non
rispetta l'interfaccia, ma non credo sia questo il caso.

2. per velocizzare il lookup del nome "int". Quando la funzione "int" è
invocata, il nome deve essere risolto e quindi viene cercato nello scope
locale e poi nello scope globale. Non essendo, presumibilmente, in
nessuno di questi due scope, viene cercato in __builtins__. Avendo un
nome locale ti permette di velocizzare l'accesso all'oggetto.

Non indagando più a fondo, credo che la scelta sia dettata dalla seconda
ragione, soprattutto se ci si trova difronte ad un ciclo:

    # foo.py:

    def foo1(v):
        for i in xrange(1000):
            a = int(v)


    def foo2(v, _int=int):
        for i in xrange(1000):
            a = _int(v)



    $ python -m timeit -s "from foo import foo1 as foo" "foo('1')"
    1000 loops, best of 3: 611 usec per loop
    $ python -m timeit -s "from foo import foo2 as foo" "foo('1')"
    1000 loops, best of 3: 573 usec per loop

ciao
m.


Maggiori informazioni sulla lista Python