我有一个python模块,它使用一个巨大的字典全局变量,目前我将计算代码放在顶部,每次第一次导入或重新加载模块需要超过一分钟,这是完全不可接受的.如何在某处保存计算结果,以便下次导入/重新加载不必计算它?我试过cPickle,但从文件(1.3M)加载字典变量大约与计算时间相同.
要提供有关我的问题的更多信息,
FD = FreqDist(word for word in brown.words()) # this line of code takes 1 min
Brian.. 17
只是为了澄清:每次导入模块时都不会执行模块正文中的代码- 它只运行一次,之后将来导入会找到已创建的模块,而不是重新创建它.查看sys.modules以查看缓存模块列表.
但是,如果您的问题是程序运行后第一次导入所需的时间,您可能需要使用除python dict之外的其他方法.可能最好使用磁盘形式,例如sqlite数据库,其中一个dbm模块.
对于界面中的最小变化,搁置模块可能是您的最佳选择 - 这会在dbm模块之间建立一个非常透明的接口,使它们像任意python dict一样,允许存储任何可选值.这是一个例子:
# Create dict with a million items: import shelve d = shelve.open('path/to/my_persistant_dict') d.update(('key%d' % x, x) for x in xrange(1000000)) d.close()
然后在下一个过程中使用它.应该没有大的延迟,因为只对磁盘表单上请求的密钥执行查找,因此所有内容都不必加载到内存中:
>>> d = shelve.open('path/to/my_persistant_dict') >>> print d['key99999'] 99999
它比真正的字典慢一点,它会仍然需要很长的时间,如果你做一些事情,需要所有的关键负载(例如,尝试将其打印出来),但可以解决您的问题.
只是为了澄清:每次导入模块时都不会执行模块正文中的代码- 它只运行一次,之后将来导入会找到已创建的模块,而不是重新创建它.查看sys.modules以查看缓存模块列表.
但是,如果您的问题是程序运行后第一次导入所需的时间,您可能需要使用除python dict之外的其他方法.可能最好使用磁盘形式,例如sqlite数据库,其中一个dbm模块.
对于界面中的最小变化,搁置模块可能是您的最佳选择 - 这会在dbm模块之间建立一个非常透明的接口,使它们像任意python dict一样,允许存储任何可选值.这是一个例子:
# Create dict with a million items: import shelve d = shelve.open('path/to/my_persistant_dict') d.update(('key%d' % x, x) for x in xrange(1000000)) d.close()
然后在下一个过程中使用它.应该没有大的延迟,因为只对磁盘表单上请求的密钥执行查找,因此所有内容都不必加载到内存中:
>>> d = shelve.open('path/to/my_persistant_dict') >>> print d['key99999'] 99999
它比真正的字典慢一点,它会仍然需要很长的时间,如果你做一些事情,需要所有的关键负载(例如,尝试将其打印出来),但可以解决您的问题.