«Наличие словаря с записью для каждой отдельной инструкции возможно, но также очень расточительно». Ожидаете ли вы, что программы, написанные на этом языке, будут содержать миллионы инструкций? Если нет, то это именно то, что я бы порекомендовал. Не оптимизируйте преждевременно. Большинство людей интерпретируют эту пословицу как относящуюся к производительности, но это относится и к использованию ресурсов.
Если вам нужно оптимизировать пространство, я бы порекомендовал, если вы используете Python 2.6 или новее, это bytearray
. Как следует из его названия, это массив байтов, и поэтому он может представлять значения 0-255. Каждый элемент в массиве будет представлять количество операторов в соответствующей строке. Преобразовать из номера инструкции обратно в номер строки будет что-то вроде этого:
instcounts = bytearray((2, 4, 6, 3, 1, 1, 5, 2, 3))
def getline(instnumber):
count = line = 0
while count <= instnumber and line < len(instcounts):
count += instcounts[line]
line += 1
return line # conveniently, this will be 1-indexed :-)
getline(15) # tells me instruction 15 is on line 5
Преимущество этого ответа перед ответом torek заключается в том, что он хранит практически одинаковую информацию только в одном байте на строку исходного кода: намного более эффективно, чем список. Вам нужно проделать небольшую дополнительную работу, чтобы выяснить номер строки, но на практике вы никогда не заметите даже очень большие файлы, и вы будете запускать его только при печати сообщений об ошибках, что вряд ли является критичной для скорости функцией. Приведенная выше функция занимает около одной десятой секунды на bytearray
, представляющем 1 000 000 строк, и это неоптимизированный код в Python 3.1 на виртуальной машине Windows XP, работающей на 4-летнем Mac Pro.
Требуется память? 1 087 199 байт, примерно четверть того, что требуется для только для списка в решении torek - не считая int
объектов, на которые есть ссылки в списке, каждый из которых составляет 14 байтов (CPython повторно использует пул однако для небольших целочисленных объектов небольшие файлы могут не использовать много, если для целых чисел будет использоваться дополнительная память.
Кстати, CPython использует очень похожую схему (см. func_code.co_lnotab
или __code__.co_lnotab
по любой функции).