我的Python代码中的记忆有问题

2024-04-19 09:54:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上读过很多回忆录的例子,但仍然无法成功地将其应用到我正在做的事情中。我尽力用自己的逻辑来编写这段代码的记忆部分,但是基于每次运行它时的测试,它不起作用。下面是我的代码的一个简单版本的例子,我写这个代码只是为了测试记忆化的概念,因为我的实际代码需要一段时间才能运行。你知道吗

import numpy as np
import time
good_data = np.array([1, 43, 22, 55, 14, 85, 23, 13, 4, 9, 21])

def image_urls(number):
    img_urls, img_data = [], []
    rows = 40
    for row in range(rows):
        path = '/%d1wxyz' % number
        url = 'http' + path
        img_urls.append(url)
    for obj in img_urls:
        for image in obj:
            data_pts = np.array([[1, 1, 1], [2, 2, 2], [number, number, number]])
            img_data.append(data_pts)
    return img_urls, img_data

cached_urls, cached_data = {}, {}
def images_data_pts(image_urls):
    t1 = time.time()
    print(np.array_equal(np.array([int(n) for n in cached_urls.keys()]), good_data))
    print(np.array_equal(np.array([int(n) for n in cached_data.keys()]), good_data))
    if np.array_equal(np.array([int(n) for n in cached_urls.keys()]), good_data) == False or np.array_equal(np.array([int(n) for n in cached_data.keys()]), good_data) == False:
        for number in good_data:
            cached_urls[str(number)], cached_data[str(number)] = image_urls(number)
    t2 = time.time()
    print('Time elapsed = ' + str(t2-t1))
    return cached_urls, cached_data

complete_urls, complete_data = images_data_pts(image_urls)

print(np.array_equal(np.array([int(n) for n in cached_urls.keys()]), good_data))
print(np.array_equal(np.array([int(n) for n in cached_data.keys()]), good_data))

最后两个print语句都是在我已经运行一次脚本之后输出的True,但是我希望在我只运行一次脚本之后,信息被存储在缓存中,这样我就不必每次都实际执行函数所做的操作。我认为这可能与这样一个事实有关,即每次我运行它时,它都会将cached_urlscached_data重新定义为空字典,可能有效地撤销了记忆。但我在示例中看到了这种技术,我不确定如何构建它。如果你有什么建议,请告诉我!你知道吗


Tags: innumberimgfordatatimenpequal
1条回答
网友
1楼 · 发布于 2024-04-19 09:54:52

当一个程序启动时,它是从一个干净的板岩开始的。这是Unix和Windows工作方式的基础。1如果您希望任何东西从一次运行持续到将来的运行,您需要将其存储在某个位置,然后重新加载。你知道吗

官方Python教程的files部分介绍了这一点。你知道吗

基本思想很简单:

  • 程序启动后,打开一个文件并读取memo缓存(如果文件不存在,就从{}开始)。你知道吗
  • 在程序完成之前,以写模式打开同一个文件,然后写下备忘录缓存。你知道吗

至于如何读写:

我怀疑您的memo缓存是JSON兼容的,基于名称(cached_urls听起来像是将字符串映射到字符串…)。如果是这样,store it as JSON,如教程所示。如果没有,请参阅^{}模块,该模块具有相同的API,但可以处理JSON无法处理的事情


1。想象一下如果那不是真的。每当程序崩溃时,当您重新启动它时,它的状态将与崩溃时完全相同,因此几乎可以肯定会立即再次崩溃…恢复的唯一方法是卸载并重新安装。

2。这种灵活性可能会给您要分发或部署的代码带来安全风险,但对于只使用来自您自己计算机的数据自己运行的代码来说,这没关系。

相关问题 更多 >