2015-06-06 5 views
-1

В программе python я разбираю двоичный файл, чтобы построить для него таблицу символов. Затем я хочу связать адреса с символами. На данный момент моя таблица символов представляет собой отсортированный список из Symbol объектов, которые сделаны из адреса, длины и имени, а поиск по символу наивно итератируется над символами. Поиска состоит в нахождении какого символ содержит заданный адрес, другие слова:Какая структура данных используется для таблицы символов?

addr >= symbol.addr and addr < symbol.addr + symbol.length 

Поскольку программы я анализирую получают очень большими, я сталкиваюсь перформанс проблема, и ищу более эффективный (с точкой зрения сложность). Я посмотрел на пакет bisect, это правильный пакет для использования в этом случае? Как бы вы это реализовали?

+0

'bisect' просто бинарный поиск, который, вероятно, не является полезным, если ваш символ таблица сортируется. Какие поисковые запросы вы делаете в таблице символов? Можете ли вы просто использовать словарь, который отображает имя символа в объект символа? – Blender

+0

@Blender Я отредактировал мой вопрос, чтобы уточнить. –

+0

@Blender no Я не могу, потому что мой поиск состоит в том, что он обнаруживает, что символ «содержит» заданный адрес, как показано в отредактированном вопросе –

ответ

1

Возможно, вы должны взглянуть на dict.

http://learnpythonthehardway.org/book/ex39.html

+0

@ Я отредактировал свой вопрос с более подробной информацией. Не могли бы вы рассказать о своем решении? –

1

Вы можете ускорить поиск, находя ближайший адрес по левому бинарного поиска:

import bisect 

addr_to_sym = {sym.addr: sym for sym in symbols} 
symbol_addrs = sorted(sym.addr for sym in symbols) 

addr = bisect.bisect_left(symbol_addrs, 0xABCDEF) 
sym = addr_to_sym[addr] 

if addr <= 0xABCDEF <= addr + sym.length: 
    # ... 
Смежные вопросы