当前位置:  开发笔记 > 编程语言 > 正文

每次重新加载python模块时如何避免计算

如何解决《每次重新加载python模块时如何避免计算》经验,为你挑选了1个好方法。

我有一个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

它比真正的字典慢一点,它仍然需要很长的时间,如果你做一些事情,需要所有的关键负载(例如,尝试将其打印出来),但可以解决您的问题.



1> Brian..:

只是为了澄清:每次导入模块时都不会执行模块正文中的代码- 它只运行一次,之后将来导入会找到已创建的模块,而不是重新创建它.查看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

它比真正的字典慢一点,它仍然需要很长的时间,如果你做一些事情,需要所有的关键负载(例如,尝试将其打印出来),但可以解决您的问题.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有