当前位置: 首页 > 面试题库 >

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

阎单鹗
2023-03-14
问题内容

有什么方法可以将结果变量保留在内存中,因此我不必每次运行脚本的开头都重新计算它?每次运行脚本时,我都会对数据集(从磁盘上读取)进行一系列(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运行新代码。



 类似资料:
  • 我想写一个脚本,它将2 GB的数据从硬盘加载到内存中,然后当其他程序请求时,它必须得到一个输入,并根据输入对这个数据进行一些计算。对我来说,重要的是将这2 GB的数据持久地保存在内存中,以加快计算速度,更重要的是避免巨大的I/O负载。 我应该如何将数据永远保存在内存中?或者更一般地说,我应该如何在Python中解决这样的问题?

  • 问题内容: 我敢肯定这很简单,但是我一直无法使其正常工作。我需要让我的主要python脚本调用另一个python脚本,并将变量从原始脚本传递到我已调用的脚本 举一个简单的例子,我的第一个脚本是 我的第二个脚本是 我希望它可以打印x但我得到 我不确定导入是否是实现此目标的正确方法,但是如果有人可以通过简单的方式对此有所了解,那就太好了! 谢谢, 编辑 阅读评论后,我想我会扩展我的问题。Aswin M

  • 问题内容: 我正在编写一个脚本来备份数据库。我有以下几行: 我想将stderr分配给一个变量,以便它将向自己发送一封电子邮件,让我知道如果出现问题,会发生什么。我已经找到了将stderr重定向到stdout的解决方案,但是由于stdout已经(通过gzip)发送到文件中,因此我无法做到这一点。如何将stderr分别存储在变量$ result中? 问题答案: 尝试将stderr重定向到stdout并

  • 问题内容: 每次在Linux中保存文件时如何运行脚本? 问题答案: Linux有一个子系统调用inotify,它可以使文件系统向应用程序报告文件系统中的更改。 您的linux系统可能有一个名为的软件包,使使用变得非常容易。(或在可用的软件包中搜索描述中包含“ inotify”一词的任何软件包)。 设置非常类似于setup ,除了在指定的时间和日期执行脚本,每当指定的文件或目录更改时执行脚本。 PS

  • 问题内容: 我试图在同一行中打印逗号后的值,以便我可以拥有这些值的csv文件,但即时通讯无法保存的值 预期输出为 请让我知道我做错了,谢谢! 问题答案: 使用反引号(或-可以嵌套),而不是单引号:

  • 问题内容: 如何保持在unitttest中继承的同一对象内所做的更改? 即:我希望以上两项测试通过 问题答案: 正如一些评论所回响的那样,以这种方式构造测试可能是测试本身的设计缺陷,您应该考虑对其进行重组。但是,如果您要执行此操作,并且依赖于所使用的测试运行程序以字母(看似)顺序执行它们的事实,那么我建议以下内容。 类似于@Matthias所说的,但是对于以后您可能决定从该类继承的情况,我会做不同