2017-02-14 4 views
0

Представьте список таких строк, как этот: ('{hello world} is awesome', 'Hello world is less awesome', '{hello world} is {awesome} too'). Я хочу, чтобы проверить каждую строку в течение цикла для начала характер, я думаю, что у меня есть 4 варианта:Каков самый быстрый способ сравнить начало строки?

if re.search(r'^\{', i): 
if re.match(r'\{', i): 
if i.startswith('{'): 
if i[:1] == '{': 

Какой самый быстрый? Есть ли еще более быстрые, чем эти 4 варианта?

Примечание: Исходная строка для сравнения может быть длиннее, а не только одна буква, например. {hello

+4

Почему вы не раз их увидеть? Во всяком случае, кажется, преждевременная оптимизация. ИМО, 'startswith()' является наиболее читаемым. –

+4

Используйте 'timeit' и посмотрите, какой метод быстрее .. – dsgdfg

+0

Последний тест должен быть' i [0] == '{' ' –

ответ

0

Как пояснил @dsqdfg в комментариях, в python есть функция синхронизации, о которой я до сих пор не знаю. Я пытался измерить их, и есть некоторые результаты:

python -m timeit -s 'text="{hello world}"' 'text[:6] == "{hello"' 
1000000 loops, best of 3: 0.224 usec per loop 

python -m timeit -s 'text="{hello world}"' 'text.startswith("{hello")' 
1000000 loops, best of 3: 0.291 usec per loop 

python -m timeit -s 'text="{hello world}"' 'import re' 're.match(r"\{hello", text)' 
100000 loops, best of 3: 2.53 usec per loop 

python -m timeit -s 'text="{hello world}"' 'import re' 're.search(r"^\{hello", text)' 
100000 loops, best of 3: 2.86 usec per loop 
4

Самый быстрый i[0] == value, так как он напрямую использует указатель на базовый массив. Regex необходимо (по крайней мере) проанализировать шаблон, а startsWith имеет накладные расходы на вызов метода и создание среза такого размера до фактического сравнения.

+0

Могу ли я использовать что-то вроде 'i [0]' для нескольких символов? (например, 'if i [: 6] == '{hello':') – aleskva

+1

Да. Нарезка создает строку, которую можно сравнить с оператором == –

Смежные вопросы