在两次Python脚本运行之间将持久变量保存在内存中
有什么方法可以将结果变量保留在内存中,因此我不必每次运行脚本的开头都重新计算它?每次运行脚本时,我都会对数据集(从磁盘上读取)进行一系列(5-10秒)的确切操作。这不会有太大问题,因为我非常擅长使用交互式编辑器在两次运行之间调试代码。但是有时交互功能只是不切实际。
我知道我可以将结果写到磁盘上的文件中,但是如果可能的话,我想避免这样做。这应该是一个解决方案,它在我第一次运行脚本时会生成一个变量,并将其保留在内存中,直到关闭外壳本身或明确告诉它退出为止。像这样:
# Check if variable already created this session
in_mem = var_in_memory() # Returns pointer to var, or False if not in memory yet
if not in_mem:
# Read data set from disk
with open('mydata', 'r') as in_handle:
mytext = in_handle.read()
# Extract relevant results from data set
mydata = parse_data(mytext)
result = initial_operations(mydata)
in_mem = store_persistent(result)
我有点想说shelve模块可能就是我在这里想要的,但是看起来为了打开一个shelve变量,我必须为持久对象指定一个文件名,所以我不确定这正是我要的东西。
关于搁置做我想做的任何提示?还有其他想法吗?
-
您可以使用
reload
全局函数来重新执行主脚本的代码,从而实现类似目的。您将需要编写一个包装器脚本,该脚本会导入您的主脚本,向其询问要缓存的变量,然后在包装器脚本的模块范围内缓存该副本,然后在需要时(当您在stdin上按Enter或其他命令时)
),它会调用,reload(yourscriptmodule)
但这次将缓存的对象传递给它,以便您的脚本可以绕过昂贵的计算。这是一个简单的例子。wrapper.py
import sys import mainscript part1Cache = None if __name__ == "__main__": while True: if not part1Cache: part1Cache = mainscript.part1() mainscript.part2(part1Cache) print "Press enter to re-run the script, CTRL-C to exit" sys.stdin.readline() reload(mainscript)
主脚本
def part1(): print "part1 expensive computation running" return "This was expensive to compute" def part2(value): print "part2 running with %s" % value
在
wrapper.py
运行时,您可以编辑mainscript.py
,向part2
功能中添加新代码,并能够针对预先计算的part1Cache运行新代码。