Чтобы измерить существующий код быстрее, добавьте def main():
перед присваиванием tokenList
, сделайте отступы после этих 4 пробелов и в конце поставьте обычную идиому
if __name__ == '__main__':
main()
(Охрана на самом деле не нужна, но, тем не менее, это хорошая привычка, поскольку для сценариев с функциями многократного использования он делает их импортируемыми из других модулей).
Это не имеет ничего общего с «объектно-ориентированным» чем-либо: просто в Python быстрее сохранять весь ваш существенный код в функциях, , а не как код модуля верхнего уровня.
Второе ускорение, замените cleanedInput
на список, то есть его первое назначение должно быть = []
, и там, где у вас сейчас есть +=
, используйте .append
вместо этого. В конце, ''.join(cleanedInput)
, чтобы получить окончательную результирующую строку. Это заставляет ваш код принимать линейное время как функцию от размера ввода (O(N)
- нормальный способ выразить это), в то время как в настоящее время требуется квадратичное время (O(N squared)
).
Тогда, правильность: два оператора сразу после continue
никогда не выполняются. Они вам нужны или нет? Удалите их (и continue
), если они не нужны, удалите continue
, если эти два оператора действительно необходимы. И тесты, начинающиеся с if diff
, будут резко провалены, если не было выполнено предыдущее if
, поскольку тогда diff
было бы неопределенным. Возможно, ваш опубликованный код содержит ошибки отступа, т. Е. Отличается ли отступ того, что вы опубликовали, от кода вашего фактического кода?
Учитывая эти важные необходимые усовершенствования и тот факт, что трудно понять, какое преимущество вы преследуете при создании этого крошечного кода ОО (и / или модульного), я предлагаю прояснить ситуацию с отступом / корректностью, применяя улучшения, которые я предложил, и оставив это на этом; -).
Редактировать : так как ОП теперь применил большинство моих предложений, позвольте мне найти один разумный способ выделить большую часть функциональности для класса в отдельном модуле. В новом файле, например foobar.py
, в том же каталоге, что и исходный скрипт (или в site-packages
, или в другом месте sys.path
), поместите этот код:
def token_of(line):
return line.partition(':')[-1].strip()
class FileParser(object):
def __init__(self, filename):
self.tokenList = open(filename, 'r')
def cleaned_input(self):
cleanedInput = []
prevLine = 0
for line in self.tokenList:
if line.startswith('LINE:'):
lineNo = int(token_of(line))
diff = lineNo - prevLine - 1
cleanedInput.append('\n' * (diff if diff>1 else diff+1))
prevLine = lineNo
else:
cleanedLine = token_of(line)
cleanedInput.append(cleanedLine + ' ')
return cleanedInput
Ваш главный сценарий становится просто:
import sys
import foobar
def main():
thefile = foobar.FileParser(sys.argv[1])
print thefile.cleaned_input()
if __name__ == '__main__':
main()