Подтвердить что ты не робот

Насколько хорошо началось?

Является

text.startswith('a')  

лучше, чем

text[0]=='a'  

?

Знание текста не пустое, и нас интересует только его первый символ.

4b9b3361

Ответ 1

Я бы согласился с другими, которые начинаются с большей читаемости, и вы должны это использовать. Тем не менее, если производительность является большой проблемой для такого особого случая, сравните ее:

$ 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 микросекунды за сравнение в зависимости от системы. Если вы не делаете миллионы сравнений во время критической ситуации, я все равно поеду с более читаемым стартом.

Ответ 2

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.

  • Что вы (и ваша команда) найдете более читаемыми?

Ответ 3

Лично я бы сказал, что startswith более читаем.

Кроме того, из Python 2.5 startwith можно взять кортеж для префиксов:

>>> "hello world".startswith(("hello","goodbye"))
True

Ответ 4

Да: его проще в использовании и легче читать. Когда вы тестируете более одной буквы, при использовании среза вы должны знать, как долго будет отображаться целевой текст:

haystack = 'Hello, World!'
needle = 'Hello'

# The easy way
result = haystack.startswith(needle)

# The slightly harder way
result = haystack[:len(needle)] == needle

Изменить: Вопрос, похоже, изменился. Теперь он говорит: "Знание текста не пустое, и нас интересует только его первый персонаж". Это превращает его в довольно бессмысленную гипотетическую ситуацию.

Я подозреваю, что вопросник пытается "оптимизировать" свой код для скорости выполнения. Если это так, мой ответ: dont. Используйте ту форму, которая более читаема и, следовательно, более удобна в обслуживании, когда вам нужно вернуться и работать над ней через год. Только оптимизировать, если профилирование показывает, что строка кода является узким местом. Это не какой-то алгоритм O (n²). Его сравнение строк.

Ответ 5

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':

Ответ 6

Фраза для квеста: "Преждевременная оптимизация - корень всего зла".

Ответ 7

text[0] может выйти из строя, но эквивалент text[:1] является безопасным, если строка пуста.

Если вы хотите сравнить несколько символов, я считаю, .startswith() лучше.

Ответ 8

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% времени процессора.

Ответ 9

text [0] == 'a' хорош, учитывая производительность. Также вы должны добавить подтверждение, когда используете это.