2013-08-26 11 views
10

Potrzebuję znaleźć wzór na sznurku i okazało się, że możemy go użyć lub znaleźć również. Czy ktokolwiek mógłby mi zasugerować, który z nich będzie lepszy/szybki na ciąg. Nie muszę znaleźć indeksu wzorca, ponieważ find może również zwrócić indeks wzorca.znajdź vs w działaniu w pytonie ciągu

temp = "5.9" 
temp_1 = "1:5.9" 
>>> temp.find(":") 
-1 
>>> if ":" not in temp: 
    print "No" 

No 

Odpowiedz

22

Użyj in, jest szybszy.

[email protected]:~$ python -m timeit 'temp = "1:5.9";temp.find(":")' 
10000000 loops, best of 3: 0.139 usec per loop 
[email protected]:~$ python -m timeit 'temp = "1:5.9";":" in temp' 
10000000 loops, best of 3: 0.0412 usec per loop 
+3

Nie tylko jest szybszy. Łatwiej jest odczytać: 'jeśli podciąg w tekście: ...' jest po prostu angielski. – Bakuriu

6

Zdecydowanie używać in. Został stworzony do tego celu i jest szybszy.

str.find() nie jest przeznaczony do takich zadań. Służy do znajdowania indeksu znaku w łańcuchu, a nie do sprawdzenia, czy znak jest w ciągu znaków. Tak więc będzie znacznie wolniej.

Jeśli pracujesz ze znacznie większymi danych, wtedy na pewno chcesz używać in dla maksymalnej wydajności:

$ python -m timeit -s "temp = '1'*10000 + ':' " "temp.find(':') == -1" 
100000 loops, best of 3: 9.73 usec per loop 
$ python -m timeit -s "temp = '1'*10000 + ':' " "':' not in temp" 
100000 loops, best of 3: 9.44 usec per loop 

Jest również dużo bardziej czytelny.

Here's a documentation link about the keyword, a także related question.

+0

Co "może być problem"? Twój przykład pokazuje, że podczas pracy z dużymi ciągami występuje niewielka różnica w wydajności. – flornquake

+0

@flornquake Ja wyjaśniłem – TerryA

+0

Chodzi mi o to, że różnica (percentage) nie wydaje się być tak duża, gdy pracujemy z dużymi ciągami znaków. Myślę, że zapomniałeś flagi '-s' przed pierwszym łańcuchem. – flornquake

1

Korzystanie z będzie szybciej, używając w zapewnia jedynie wzorzec natomiast jeśli używasz znaleźć to daje wzór, jak również jego indeksie tak to zajmie trochę czasu przy obliczaniu indeksu łańcucha w stosunku do in. Jednak jeśli nie masz do czynienia z dużymi danymi, to nie ważne, co używasz.