首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我的Python代码中的memoization问题

我的Python代码中的memoization问题
EN

Stack Overflow用户
提问于 2018-09-20 05:19:49
回答 1查看 0关注 0票数 0

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

代码语言:javascript
复制
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_urls,并cached_data为空字典我每次运行它的时候,也许是有效地撤消记忆化。但是我在示例中看到了这种技术,我不确定如何构建它。如果您有任何提示,请告诉我!

EN

回答 1

Stack Overflow用户

发布于 2018-09-20 14:55:10

程序启动时,它以干净的平板开始。这是Unix和Windows工作方式的基础。1如果您希望从一次运行到将来的运行持续存在任何内容,则需要将其存储在某处,然后将其加载回来。

这在文件部分的官方Python教程中有所介绍。

基本思路很简单:

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

至于如何阅读和写它:

我怀疑你的备忘录缓存是基于名称的JSON兼容(cached_urls听起来它会将字符串映射到字符串......)。如果是这样,请将其存储为JSON,如教程中所示。如果没有,请参阅pickle模块,该模块具有相同的API,但可以处理JSON无法处理的事情。2

想象一下,如果不是这样的话。任何时候你崩溃一个程序,当你重新启动它时,它会出现与崩溃时完全相同的状态,所以它几乎肯定会立即再次崩溃......唯一的恢复方法是卸载并重新安装。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档