我需要使用大数据结构,更具体地说,使用大字典来完成查找工作.
在最初我的代码是这样的:
#build the dictionaryblablabla#look up some information in the ditionaryblablabla
由于我需要多次查看,我开始意识到将它实现为函数是个好主意,比如查找(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_dictdef lookup1(city,city_code_dict): try: return city_code_dict[city] except Exception: return Nonedef lookup2(city): try: return big_dict[city] except Exception: return Nonet = 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 is 8.410885
lookup2 is 8.157661
class is 4.525721
所以似乎两种方式几乎相同,是的,全局变量方法更有效.
EDIT2:
添加了Amber建议的类版本,然后再次测试效率.然后我们可以从结果中看出Amber是对的,我们应该使用类版本.
最佳答案都不是.使用专门用于将函数(方法)与数据(成员)分组的类:class BigDictLookup(object): def __init__(self): self.bigdict = build_big_dict() # or some other means of generating it def lookup(self): # do something with self.bigdictdef main(): my_bigdict = BigDictLookup() # ... my_bigdict.lookup() # ... my_bigdict.lookup()
总结 以上是内存溢出为你收集整理的在Python中的函数中使用大数据结构时的效率全部内容,希望文章能够帮你解决在Python中的函数中使用大数据结构时的效率所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)