Мне нужно использовать большую структуру данных, а точнее большой словарь, чтобы выполнять поиск.
В самом начале мой код выглядит так:
#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, а затем снова проверьте эффективность. Тогда мы могли видеть из результатов, что Эмбер права, мы должны использовать версию класса.