numpy 数组的缓存装饰器

2024-03-08

我正在尝试为具有 numpy 数组输入参数的函数制作一个缓存装饰器

from functools import lru_cache
import numpy as np
from time import sleep

a = np.array([1,2,3,4])

@lru_cache()
def square(array):
    sleep(1)
    return array * array

square(a)

但 numpy 数组不可散列,

TypeError                                 Traceback (most recent call last)
<ipython-input-13-559f69d0dec3> in <module>()
----> 1 square(a)

TypeError: unhashable type: 'numpy.ndarray'

因此需要将它们转换为元组。我的工作和缓存正确:

@lru_cache()
def square(array_hashable):
    sleep(1)
    array = np.array(array_hashable)
    return array * array

square(tuple(a))

但我想把它全部包裹在一个装饰器中,到目前为止我已经尝试过:

def np_cache(function):
    def outter(array):
        array_hashable = tuple(array)

        @lru_cache()
        def inner(array_hashable_inner):
            array_inner = np.array(array_hashable_inner)
            return function(array_inner)

        return inner(array_hashable)

    return outter

@np_cache
def square(array):
    sleep(1)
    return array * array

But 缓存不起作用。计算已执行但未正确缓存,因为我总是等待 1 秒。

我在这里缺少什么?我正在猜测lru_cache没有获得正确的上下文并且它在每次调用中都被实例化,但我不知道如何修复它。

我试过盲目地扔functools.wraps装饰者到处都没有运气。


你的包装函数创建了一个new inner()功能每次你打电话的时候。而那个新的函数对象是在那时被装饰的,所以最终的结果是每次outter()被称为,一个新的lru_cache()创建后,它将是空的。空的缓存总是需要重新计算值。

您需要创建一个装饰器,将缓存附加到创建的函数就一次每个装饰目标。如果您要在调用缓存之前转换为元组,那么您必须创建two功能:

from functools import lru_cache, wraps

def np_cache(function):
    @lru_cache()
    def cached_wrapper(hashable_array):
        array = np.array(hashable_array)
        return function(array)

    @wraps(function)
    def wrapper(array):
        return cached_wrapper(tuple(array))

    # copy lru_cache attributes over too
    wrapper.cache_info = cached_wrapper.cache_info
    wrapper.cache_clear = cached_wrapper.cache_clear

    return wrapper

The cached_wrapper()每次调用仅创建一次函数np_cache()并且可供wrapper()作为闭包的功能。所以wrapper() calls cached_wrapper(),其中有一个@lru_cache()附加到它,缓存你的元组。

我还复制了两个函数引用lru_cache放置一个装饰函数,因此也可以通过返回的包装器访问它们。

此外,我还使用了@functools.wraps()装饰者 https://docs.python.org/3/library/functools.html#functools.wraps将元数据从原始函数对象复制到包装器,例如名称、注释和文档字符串。这始终是一个好主意,因为这意味着在调试时以及需要访问文档或注释时,您的修饰函数将在回溯中清楚地标识出来。装饰器还添加了一个__wrapped__属性指向原始函数,这将如果需要的话,让你再次打开装饰器 https://docs.python.org/3/library/inspect.html#inspect.unwrap.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 数组的缓存装饰器 的相关文章

随机推荐

  • 有人对以这种方式使用黑板模式有想法吗?

    有人对 实用程序员 第 165 页中的 Blackboard 概念有什么想法吗 我想要几个彼此独立的小子系统 DLL 和 EXE 有一些程序集将被所有 EXE 使用 这些程序集几乎都使用相同的数据库 Blackboard 类型模式不是使用接
  • 确定对不正确的 .NET Framework 版本的间接依赖的来源

    我想知道如何确定此构建错误的来源 Warning 4 The primary reference MyNamespace MyProject could not be resolved because it has an indirect
  • 仅当值不为空时 PHP/MYSQL 更新

    我正在构建一个表单来更新多列数据 这段代码对于我的目的来说已经部分成功 剩下要做的唯一一件事就是包含 如果 IS NOT NULL 更新查询 我不知道该怎么做 换句话说 我只希望在 POST 值不为空时执行 UPDATE
  • Magento 网站突然出现“未收到数据”错误代码:ERR_EMPTY_RESPONSE

    我们在电子商务网站上运行 Magento 最近几天似乎有些非常重要的页面根本无法加载 网站上的大部分页面加载良好 但是如果用户 登录 并且他们尝试访问购物车结帐页面 迄今为止最重要的页面 他们会收到下图所示的非常令人讨厌的消息 据我所知 最
  • 从 WebJob 中停止网站

    有什么方法可以阻止 WebJob 访问 Azure 网站吗 我有一个使用 Ghost 在 Node 上运行的 Azure 网站 我正在尝试安排 Ghost 数据库文件的备份 最好在站点未运行时进行备份 我可以通过使用 Kudu PowerS
  • 如何防止外部脚本使用break语句终止脚本

    我正在调用一个外部 ps1 文件 其中包含break某些错误情况下的语句 我想以某种方式捕获这种情况 允许任何外部打印的消息正常显示 并继续执行脚本中的后续语句 如果外部脚本有throw 这可以很好地使用try catch 即使trap在我
  • 如何将 ExpandableListView 放入 ScrollView 中而不使其折叠?

    我想在 ScrollView 中使用 ExpandableListView 与其他视图 但我在 ExpandableListView 中遇到了自滚动器的问题 我尝试禁用它 但问题在于 ExpandableListView 的高度及其内部布局
  • 如何在不使用任何库的情况下检测android中的IBeacon

    我是 Ibeacon 的新手 我想知道我们是否可以在不使用任何 SDKLibrary 或库的情况下检测 Android 中的 Ibeacon 任何人都可以给出示例 我知道一些像 Radius Networks 这样的库 但我不想使用任何图书
  • CSS min-width 不显示水平滚动条

    我建立了一个网站 并使用了最小宽度 css body overflow auto min width 1600px 但是当它以较小的分辨率加载时 它不会出现水平滚动条 我应该怎么做才能出现水平滚动条 您无需声明overflow如果您希望滚动
  • MKMapView 调用 didSelectAnnotationView

    I use MKMapView 在地图上我显示可点击AnnotationViews 点击后AnnotationView 我将 MyController 推送到NavigationController 在 MyController 中 我单击
  • 流构建器在导航后未更新

    我正在使用流生成器来检测用户是否登录 return StreamBuilder
  • DropzoneJS 和 Laravel - 输出表单验证错误

    当您将鼠标悬停在 Dropzone 中丢弃的文件中的 X 上时 我试图输出表单验证错误 我得到什么 我怎样才能使object Object从表单验证中输出实际的错误消息 我可以警告错误消息 但将鼠标悬停在 x 上时实际上无法显示错误消息 我
  • 编辑 RichTextBox Run 元素而不拆分为多个 Run 元素 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个 WPF 应用程序RichTextBox 文本框中的文本通过跨度以编程方式构建并运行到一个段落 每个句子都是一个
  • 中继器中的 ASP.NET RadioButtonList?

    aspx 文件
  • 使用路由时将 match param 和 props 传递到 React 组件中

    我有一个功能性反应组件 想要为我的组件中选定的人呈现一些属性 所以我首先绘制一个简单的列表 其中包含每个人的链接 props persons map person i gt return li person name li 然后我制定路线
  • String 和 Char 类型在 .NET 中如何存储在内存中?

    我需要存储一个语言代码字符串 例如 en 它始终包含 2 个字符 将类型定义为 String 还是 Char 更好 private string languageCode vs private char languageCode 或者还有其
  • 在网络应用程序中显示文件类型图标?

    在桌面应用程序中 您通常可以获取特定文件类型的底层操作系统图标并将其显示给用户 在网络应用程序中 我无法使用此类功能 因此看起来我可能需要提供自己的图标集 有谁知道有哪些针对常见图标类型的经过良好许可的免费图标集 我找到了一个github上
  • 处理 AJAX 请求上的 SAML 重定向

    我有几个 AngularJS 应用程序 全部使用 Spring Java 和 SAML 2 0 进行 SSO 利用 Spring Security SAML 扩展 我的 SSO ID 提供商是 OpenAM 一切运行良好 但是 我遇到了一种
  • 是否应该将依赖项注入比需要的更多“级别”?

    我正在使用 SOLID 原则编写 C ASP NET MVC Web 应用程序 我写了一个ViewModelService 这取决于AccountService and a RepositoryService 所以我将这两个服务注入到Vie
  • numpy 数组的缓存装饰器

    我正在尝试为具有 numpy 数组输入参数的函数制作一个缓存装饰器 from functools import lru cache import numpy as np from time import sleep a np array 1