Является
text.startswith('a')
лучше, чем
text[0]=='a'
?
Знание текста не пустое, и нас интересует только его первый символ.
Является
text.startswith('a')
лучше, чем
text[0]=='a'
?
Знание текста не пустое, и нас интересует только его первый символ.
Я бы согласился с другими, которые начинаются с большей читаемости, и вы должны это использовать. Тем не менее, если производительность является большой проблемой для такого особого случая, сравните ее:
$ python -m timeit -s 'text="foo"' 'text.startswith("a")'
1000000 loops, best of 3: 0.537 usec per loop
$ python -m timeit -s 'text="foo"' 'text[0]=="a"'
1000000 loops, best of 3: 0.22 usec per loop
Итак, text[0]
- это в 2,5 раза быстрее, но это довольно быстрая операция; вы сэкономите ~ 0,3 микросекунды за сравнение в зависимости от системы. Если вы не делаете миллионы сравнений во время критической ситуации, я все равно поеду с более читаемым стартом.
text[0]
терпит неудачу, если text
- пустая строка:
IronPython 2.6 Alpha (2.6.0.1) on .NET 4.0.20506.1
Type "help", "copyright", "credits" or "license" for more information.
>>> text = ""
>>> print(text.startswith("a"))
False
>>> print(text[0]=='a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index out of range: 0
EDIT: Вы говорите, что знаете, что text
не пуст... насколько вы уверены в этом, и что бы вы хотели, если он пуст на самом деле? Если сбой является подходящим (например, это означает ошибку в коде), который будет способствовать использованию text[0]=='a'
.
Другие вопросы:
Насколько вы обеспокоены результатами этого? Если это критически важно для производительности, то сравнивайте его с конкретной средой исполнения Python. Я не был бы полностью удивлен, обнаружив, что (например) одна форма была быстрее на IronPython, а другая - на CPython.
Что вы (и ваша команда) найдете более читаемыми?
Лично я бы сказал, что startswith
более читаем.
Кроме того, из Python 2.5 startwith
можно взять кортеж для префиксов:
>>> "hello world".startswith(("hello","goodbye"))
True
Да: его проще в использовании и легче читать. Когда вы тестируете более одной буквы, при использовании среза вы должны знать, как долго будет отображаться целевой текст:
haystack = 'Hello, World!'
needle = 'Hello'
# The easy way
result = haystack.startswith(needle)
# The slightly harder way
result = haystack[:len(needle)] == needle
Изменить: Вопрос, похоже, изменился. Теперь он говорит: "Знание текста не пустое, и нас интересует только его первый персонаж". Это превращает его в довольно бессмысленную гипотетическую ситуацию.
Я подозреваю, что вопросник пытается "оптимизировать" свой код для скорости выполнения. Если это так, мой ответ: dont. Используйте ту форму, которая более читаема и, следовательно, более удобна в обслуживании, когда вам нужно вернуться и работать над ней через год. Только оптимизировать, если профилирование показывает, что строка кода является узким местом. Это не какой-то алгоритм O (n²). Его сравнение строк.
PEP 8 явно говорит использовать startswith
из-за читаемости:
- Use ''.startswith() and ''.endswith() instead of string
нарезка для проверки для префиксов или суффиксов.
startswith() and endswith() are cleaner and less error prone. For example: Yes: if foo.startswith('bar'): No: if foo[:3] == 'bar':
Фраза для квеста: "Преждевременная оптимизация - корень всего зла".
text[0]
может выйти из строя, но эквивалент text[:1]
является безопасным, если строка пуста.
Если вы хотите сравнить несколько символов, я считаю, .startswith()
лучше.
def compo2():
n = "abba"
for i in range(1000000):
n[:1]=="_"
быстрее, чем
def compo():
n = "abba"
for i in range(1000000):
n.startswith("_")
cProfile сообщает 0.061 для compo2
по сравнению с 0.954 для compo
на моей машине.
Это интересно в случае, если вы хотите сделать много префиксных проверок для разных "_mystring".
Если большинство строк не начинаются с символов подчеркивания, то использование string[:1]== char
перед использованием startswith
- это опция для оптимизации вашего кода.
В реальном приложении этот метод спас мне около 15% времени процессора.
text [0] == 'a' хорош, учитывая производительность. Также вы должны добавить подтверждение, когда используете это.