Эффективность использования большой структуры данных в функции в Python

Мне нужно использовать большую структуру данных, а точнее большой словарь, чтобы выполнять поиск.

В самом начале мой код выглядит так:

#build the dictionary
blablabla
#look up some information in the ditionary
blablabla

Поскольку мне нужно искать много раз, я начинаю понимать, что неплохо реализовать его как функцию, скажем lookup (info) .

Тогда возникает проблема: как мне обращаться с большим словарем?

Следует ли мне использовать lookup (info, dictionary) , чтобы передать его в качестве аргумента, или я должен просто инициализировать словарь в main () и просто использовать его как глобальную переменную ?

Первый вариант кажется более элегантным, поскольку я считаю, что поддерживать глобальную переменную сложно. Но с другой стороны, я не уверен в эффективности передачи функции большого словаря. Он будет вызываться много раз, и это, безусловно, будет кошмаром, если передача аргументов неэффективна.

Спасибо.

Edit1:

Я только что провел эксперимент двумя способами, описанными выше:

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

class CityDict():
    def __init__():
        self.code_dict = get_code_dict()
    def get_city(city):
        try:
            return self.code_dict[city]
        except Exception:
            return None         

def get_code_dict():
    # initiate code dictionary from file
    return code_dict

def lookup1(city, city_code_dict):
    try:
        return city_code_dict[city]
    except Exception:
        return None

def lookup2(city):
    try:
        return big_dict[city]
    except Exception:
        return None


t = time.time()
d = get_code_dict()
for i in range(0, 1000000):
    lookup1(random.randint(0, 10000), d)

print "lookup1 is %f" % (time.time() - t)


t = time.time()
big_dict = get_code_dict()
for i in range(0, 1000000):
    lookup2(random.randint(0, 1000))
print "lookup2 is %f" % (time.time() - t)


t = time.time()
cd = CityDict() 
for i in range(0, 1000000):
    cd.get_city(str(i))
print "class is %f" % (time.time() - t)

Это результат:

lookup1 равен 8.410885
lookup2 равен 8.157661
класс 4.525721

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

Edit2:

Добавлена ​​предлагаемая версия класса пользователя Amber, а затем снова проверьте эффективность. Тогда мы могли видеть из результатов, что Эмбер права, мы должны использовать версию класса.

5
задан smci 9 April 2012 в 19:26
поделиться