@H_403_1@我需要使用大数据结构,更具体地说,使用大字典来完成查找工作.
@H_403_1@在最初我的代码是这样的:
@H_403_1@
但另一方面,我不确定将大字典传递给函数的效率.它将被多次调用,如果传递的参数效率低下,它肯定会成为一场噩梦. @H_403_1@谢谢. @H_403_1@EDIT1: @H_403_1@我刚刚对上述两种方式进行了实验: @H_403_1@这是代码的片段. lookup1实现传递查找的参数,而lookup2使用全局数据结构“big_dict”. @H_403_1@
#build the dictionary
blablabla
#look up some information in the ditionary
blablabla
@H_403_1@由于我需要多次查看,我开始意识到将它实现为函数是个好主意,比如查找(info).
@H_403_1@然后问题来了,我应该如何处理大字典?
@H_403_1@我应该使用lookup(info,dictionary)将其作为参数传递,还是应该只在main()中初始化字典并将其用作全局变量?
@H_403_1@第一个似乎更优雅,因为我认为维护全局变量很麻烦.但另一方面,我不确定将大字典传递给函数的效率.它将被多次调用,如果传递的参数效率低下,它肯定会成为一场噩梦. @H_403_1@谢谢. @H_403_1@EDIT1: @H_403_1@我刚刚对上述两种方式进行了实验: @H_403_1@这是代码的片段. lookup1实现传递查找的参数,而lookup2使用全局数据结构“big_dict”. @H_403_1@
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)
@H_403_1@这是输出:
@H_403_1@
@H_403_1@lookup1 is 8.410885@H_403_1@所以似乎两种方式几乎相同,是的,全局变量方法更有效. @H_403_1@EDIT2: @H_403_1@添加了Amber建议的类版本,然后再次测试效率.然后我们可以从结果中看出Amber是对的,我们应该使用类版本.
lookup2 is 8.157661
class is 4.525721
最佳答案
都不是.使用专门用于将函数(方法)与数据(成员)分组的类:
@H_403_1@
原文链接:https://www.f2er.com/python/439614.htmlclass BigDictLookup(object):
def __init__(self):
self.bigdict = build_big_dict() # or some other means of generating it
def lookup(self):
# do something with self.bigdict
def main():
my_bigdict = BigDictLookup()
# ...
my_bigdict.lookup()
# ...
my_bigdict.lookup()