我的Python代码中的备注问题

时间:2018-08-01 00:31:59

标签: python python-3.x memoization

我已经在线阅读了许多备忘录的示例,但是仍然无法成功将其应用于我正在做的事情。我尽力使用自己的逻辑编写此代码的备注部分,但是根据我每次运行它的测试,它无法正常工作。下面是我的代码的一个简单版本的示例,我编写该代码只是为了测试记忆概念,因为我的实际代码需要一段时间才能运行。

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被重新定义为空字典,也许有效地撤消了备忘录。但是我在示例中看到了这种技术,并且不确定如何构造它。如果您有任何提示,请告诉我!

1 个答案:

答案 0 :(得分:0)

程序启动时,它将以干净的状态开始。这是Unix和Windows共同工作的基础。 1 如果您希望从一次运行到将来的运行都可以保留任何东西,则需要将其存储在某个地方,然后再加载回去。

files部分的官方Python教程对此进行了介绍。

基本思想很简单:

  • 程序启动后,立即打开一个文件并读取备忘录缓存(如果该文件不存在,则以{}开头)。
  • 在程序完成之前,立即以写入模式打开相同的文件并写入备忘录缓存。

关于如何读写它:

我怀疑您的备忘录缓存基于名称({cached_urls听起来像是将字符串映射到字符串……)。如果是这样,请按照本教程中的说明store it as JSON。如果不是,请参见pickle模块,该模块具有相同的API,但可以处理JSON无法解决的问题。 2


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

2。对于要分发或部署的代码,这种灵活性可能会带来安全风险,但是对于仅使用来自您自己的计算机的数据运行代码的人来说,就可以了。