У меня есть некоторый код Python, который оценивает файл строка за строкой, как это:

def evaluate_file():
  firstline = True
  for line in lines:
    if firstline:
      # do something with the first line
      firstline = False
    else
      # do something else

В 99% случаев просматривается не первая строка. Есть ли какое-либо улучшение эффективности для написания первого случая 99%, то есть первого оператора if if !firstline?

0
franklin 2 Июл 2019 в 22:13

2 ответа

Разница будет незначительной, если ваше условие в 1% будет просто «первой строкой». Что могло бы сэкономить время, так это выполнить 1% за пределами цикла, а затем безоговорочно выполнить цикл для последующих элементов. Это сэкономит 99% бесполезного тестирования для условия первой строки и, что более важно, улучшит удобочитаемость вашего кода (хотя бы за счет уменьшения уровней отступа).

Использование итератора - эффективный способ сделать это разделение. Например:

iLines =iter(lines)
for line in iLines:
    # do something with the first line
    break 
for line in iLines:
    # do something else with other lines

Это будет работать со списками и с источниками, которые не могут быть проиндексированы или разрезаны. Это также учитывает более сложные условия «первой части», которые могут потребовать пропустить более одного начального элемента.

Если код, который нужно выполнить для первой строки, является «дополнением» к общему коду для всех строк, может быть проще использовать перечисление вместо переменной флага (хотя это немного медленнее):

for i,line in enumerate(lines):
    if i==0:
       # do something special for the first line
    # common code for all lines 

Вы также можете использовать подход итератора и поместить общий код в функцию, которую вы вызываете в обоих случаях.

1
Alain T. 2 Июл 2019 в 22:41

Если в сценарии использования есть что-то еще (что потребовало бы обновления вопроса с помощью [mcve]), зачем использовать условную для определения «первой» строки, когда вы можете просто нарезать lines и делать то, что вам нужно с первым один, а потом еще что-нибудь с остальными?

def evaluate_file():
  # evaluate the first line:
  # do something with ``lines[0]``

  for line in lines[1:]
      # do some
1
David Zemens 2 Июл 2019 в 19:20