我正在为我在python中编写的boggle-clone创建一个联网服务器,它接受用户,解决板,并对玩家输入进行评分。我正在使用的字典文件是1.8MB(ENABLE2K字典),我需要它可以用于几个游戏求解器类。现在,我有它,以便每个类逐行遍历文件并生成一个哈希表(关联数组),但我实例化的解算器类越多,它占用的内存就越多。

我想要做的是导入一次字典文件,并在需要时将其传递给每个求解器实例。但是最好的方法是什么?我应该在全局空间中导入字典,然后在解算器类中以globals()['字典']的形式访问它吗?或者我应该导入字典然后将其作为参数传递给类构造函数?其中一个比另一个好吗?还有第三种选择吗?

有帮助吗?

解决方案

如果您创建了一个dictionary.py模块,其中包含读取文件并构建字典的代码,则此代码仅在第一次导入时执行。进一步导入将返回对现有模块实例的引用。因此,您的课程可以:

import dictionary

dictionary.words[whatever]

其中dictionary.py有:

words = {}

# read file and add to 'words'

其他提示

尽管此时它基本上是一个单例,但是反对全局变量的常用参数适用。对于pythonic单例替代品,查找“borg”。宾语。

这真的是唯一的区别。创建字典对象后,除非您明确执行深层复制,否则只有在传递新引用时才绑定它们。只要每个求解器实例不需要私有副本进行修改,它就会被集中构建一次且只有一次。

亚当,请记住在Python中说:

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。

根据你的dict包含的内容,你可能会对'shelve'或'anydbm'模块感兴趣。它们为你提供了类似dict的接口(只是字符串作为'anydbm'的键和项,字符串作为键,任何python对象作为'shelve'项)但数据实际上是在DBM文件中(gdbm,ndbm,dbhash, bsddb,取决于平台上可用的内容。)您可能仍然希望按照您的要求在类之间共享实际的数据库,但它将避免解析文本文件步骤以及保持全部进入-memory bit。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top