我正在为我在python中编写的boggle-clone创建一个联网服务器,它接受用户,解决板,并对玩家输入进行评分。我正在使用的字典文件是1.8MB(ENABLE2K字典),我需要它可以用于几个游戏求解器类。现在,我有它,以便每个类逐行遍历文件并生成一个哈希表(关联数组),但我实例化的解算器类越多,它占用的内存就越多。
我想要做的是导入一次字典文件,并在需要时将其传递给每个求解器实例。但是最好的方法是什么?我应该在全局空间中导入字典,然后在解算器类中以globals()['字典']的形式访问它吗?或者我应该导入字典然后将其作为参数传递给类构造函数?其中一个比另一个好吗?还有第三种选择吗?
答案 0 :(得分:10)
如果您创建了一个dictionary.py模块,其中包含读取文件并构建字典的代码,则此代码仅在第一次导入时执行。进一步导入将返回对现有模块实例的引用。因此,您的课程可以:
import dictionary
dictionary.words[whatever]
其中dictionary.py有:
words = {}
# read file and add to 'words'
答案 1 :(得分:1)
尽管此时它基本上是一个单例,但是反对全局变量的常用参数适用。对于pythonic单例替换,查找“borg”对象。
这真的是唯一的区别。创建字典对象后,除非您明确执行深层复制,否则只有在传递新引用时才绑定它们。只要每个求解器实例不需要私有副本进行修改,它就会被集中构建一次且只有一次。
答案 2 :(得分:1)
a = read_dict_from_file()
b = a
...你实际上并没有复制 a
,因此使用更多内存,你只是在b
对同一个对象进行另一次引用。
所以基本上你建议的任何解决方案在内存使用方面都要好得多。基本上,在字典中读取一次,然后继续引用它。无论您是使用全局变量,还是将其传递给每个实例,还是其他内容,您都将引用相同的对象而不是重复它。
哪一个最像Pythonic?这是一个完整的“蠕虫病毒”,但这就是我个人所做的事情:
def main(args):
run_initialization_stuff()
dictionary = read_dictionary_from_file()
solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]
HTH。
答案 3 :(得分:0)
根据你的dict包含的内容,你可能会对'shelve'或'anydbm'模块感兴趣。它们为你提供类似dict的接口(只是字符串作为'anydbm'的键和项,字符串作为键,任何python对象作为'shelve'项)但数据实际上是在DBM文件中(gdbm,ndbm,dbhash, bsddb,取决于平台上可用的内容。)您可能仍然希望按照您的要求在类之间共享实际的数据库,但它将避免解析文本文件步骤以及保持全部进入-memory bit。