在两次Python脚本运行之间将持久变量保存在内存中

发布于 2021-01-29 19:35:08

有什么方法可以将结果变量保留在内存中,因此我不必每次运行脚本的开头都重新计算它?每次运行脚本时,我都会对数据集(从磁盘上读取)进行一系列(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变量,我必须为持久对象指定一个文件名,所以我不确定这正是我要的东西。

关于搁置做我想做的任何提示?还有其他想法吗?

关注者
0
被浏览
71
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用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运行新代码。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看