2015-02-17 14 views
6

Mi sono appena imbattuto in curses.ascii.islower(). Controlla se il carattere passato è in minuscolo. Qual è il vantaggio nell'uso di questa funzione rispetto a str.islower()? Sì, richiede una conversione di un carattere ASCII nell'oggetto stringa, che aggiunge un sovraccarico. Ma a parte questo ci sono dei vantaggi?Perché usare curses.ascii.islower?

Uno svantaggio che ho trovato è la necessità di una libreria aggiuntiva, che può essere o non essere disponibile.

+2

Lasciamo aperto. Non penso sia troppo ampio. OP sta chiedendo perché il modulo esista considerando che alcune funzioni sembrano essere ben trattate altrove. Penso che sia una domanda a cui si può rispondere in modo sintetico. –

+0

'ascii.islower' funziona esplicitamente su ascii. presumibilmente questo potrebbe essere più efficiente di 'str.islower'? – njzk2

risposta

2

Timing sia sembra str.islower è molto più efficiente in modo che non è solo il sovraccarico di dover importare:

python2:

In [68]: timeit islower("f") 
1000000 loops, best of 3: 641 ns per loop 

In [69]: timeit "f".islower() 
10000000 loops, best of 3: 50.5 ns per loop 

python3

In [2]: timeit "f".islower() 
10000000 loops, best of 3: 58.7 ns per loop 

In [3]: timeit islower("f") 
1000000 loops, best of 3: 801 ns per loop 

Una differenza/Il vantaggio è che non si deve effettivamente eseguire il cast su un oggetto str, è possibile passare una stringa di un carattere o un intero.

In [38]: ascii.islower(97) 
Out[38]: True 

Ma usando chr con str.lower è ancora più efficiente:

In [51]: timeit ascii.islower(122) 
1000000 loops, best of 3: 583 ns per loop 

In [52]: timeit chr(122).islower() 
10000000 loops, best of 3: 122 ns per loop 

L'unico riferimento la curses howto documentation fa circa l'uso di curses.ascii è come può essere utile quando si utilizza la libreria curses:

while 1: 
    c = stdscr.getch() 
    if c == ord('p'): 
     PrintDocument() 
    elif c == ord('q'): 
     break # Exit the while() 
    elif c == curses.KEY_HOME: 
     x = y = 0 

Il modulo curses.ascii fornisce classe ASCII funzioni di appartenenza che accettano argomenti interi o stringa di 1 carattere; questi possono essere utili per scrivere test più leggibili per i tuoi interpreti di comando. Fornisce anche funzioni di conversione che accettano argomenti interi o stringa di 1 carattere e restituiscono lo stesso tipo.

penso vi sarà difficile trovare alcun vantaggio utilizzando ascii.islower oltre str.islower al di fuori di qualsiasi questione relativa al modulo di maledizioni.

+0

Non pensare 'ascii.islower (" f ")' vs '" f ".islower()' sta testando la velocità delle funzioni (solo), dal momento che il primo include una ricerca di attributi. – ideasman42

+0

@ ideasman42, come puoi vedere c'è letteralmente zero differenza, pochi nanosecondi –

0

Eseguire alcuni test leggermente diversi, tentando di verificare solo la velocità della funzione (nessuna ricerca di attributi o differenze nello spazio dei nomi).

Testato Python3.4 (possono facilmente eseguire questi da soli)

python3 -m timeit -s "f = str.islower" \ 
     "f('A')" 

0.171 usec per loop


Rispetto:

python3 -m timeit \ 
     -s "import curses.ascii; f = curses.ascii.islower; del curses" \ 
     "f('A')" 

0.722 usec per loop


In pratica non si chiamerebbe così.