2016-06-12 12 views
0

Ich lerne Python von Grund auf neu. Für dasselbe verwende ich das Buch 'How To Think Like a Computer Scientist'. Abschnitt 7.12 der gleichen behandelt Zeichenklassifizierung und es listet 3 verschiedene Möglichkeiten der Bestimmung, ob ein gegebenes Zeichen (CH) ist in Kleinbuchstaben, wie folgt:Welche davon ist der schnellste Weg, um den Fall eines Charakters zu überprüfen?

1.

def is_lower(ch):  
     return string.find(string.lowercase, ch) != -1 

2.

 def is_lower(ch): 
     return ch in string.lowercase 

3.

 def is_lower(ch): 
     return 'a' <= ch <= 'z' 

ich dachte, welche dieser w wäre der schnellste für die Verarbeitung. Ich kümmere mich nur um die Verarbeitungszeit, nicht um die Speicheranforderungen. Ich vermute, dass es der dritte ist, weil in den ersten beiden Fällen die gesamte Zeichenfolge bis zum Ende verarbeitet werden muss, um herauszufinden, ob der Charakter überhaupt vorhanden ist, während im dritten Fall nur zwei Vergleiche ausreichen und der Die ganze Zeichenfolge muss nicht verarbeitet werden. So ist meine Vermutung richtig?

+3

Warum testen Sie sie nicht? Führen Sie jede Funktion 1.000.000 Mal aus und messen Sie die verstrichene Zeit. – deepmax

+2

Was verwenden Sie nicht die eingebaute 'ch.islower()'? Nicht müssen Sie Ihre eigenen schreiben. –

+0

@deepmax Ich habe dieses Level noch nicht erreicht, wo ich genau die Zeit messen kann, die eine bestimmte Funktion zur Ausführung benötigt. Theoretisch kann ich zwar die verschiedenen Wege sehr oft durchlaufen und dann den Unterschied messen, aber in diesem Fall sollte auch der Prozessor während aller 3 Testläufe gleich leer sein, und das ist in meinem Fall praktisch nicht möglich. – Hiren

Antwort

0

Unten ist mein Testcode mit timeit:

import string 
import timeit 
import random 

def is_lower(ch): 
    return string.find(string.lowercase, ch) != -1 

def is_lower1(ch): 
    return ch in string.lowercase 

def is_lower2(ch): 
    return 'a' <= ch <= 'z' 

def wrapper(func, *args, **kwargs): 
    def wrapped(): 
     return func(*args, **kwargs) 
    return wrapped 

for i in range(100): 
    lt = random.choice(string.letters) 
    wrappered1 = wrapper(is_lower, lt) 
    wrappered2 = wrapper(is_lower1, lt) 
    wrappered3 = wrapper(is_lower2, lt) 
    t1, t2, t3 = [], [], [] 
    t1 += timeit.repeat(wrappered1, repeat=3, number=100000) 
    t2 += timeit.repeat(wrappered2, repeat=3, number=100000) 
    t3 += timeit.repeat(wrappered3, repeat=3, number=100000) 

print 't1: ', sum(t1)/len(t1) 
print 't2: ', sum(t2)/len(t2) 
print 't2: ', sum(t3)/len(t3) 

Ausgang:

Out[44]: 
t1: 0.0781290027991 
t2: 0.0348194339546 
t2: 0.0307262024573 

Es ist deutlich zu sehen, die letzte Methode ist die schnellste, während der erste die langsamste ist.

Verwandte Themen