Python 装饰器对递归函数进行计时

2023-11-22

我有一个简单的装饰器来跟踪函数调用的运行时:

def timed(f):
    def caller(*args):
        start = time.time()
        res = f(*args)
        end = time.time()
        return res, end - start
    return caller

可以按如下方式使用,并返回函数结果和执行时间的元组。

@timed
def test(n):
    for _ in range(n):
        pass
    return 0

print(test(900)) # prints (0, 2.69e-05)

够简单的。但现在我想将其应用于递归函数。正如预期的那样,将上述包装器应用于递归函数会产生带有每次递归调用时间的嵌套元组。

@timed
def rec(n):
    if n:
        return rec(n - 1)
    else:
        return 0

print(rec(3)) # Prints ((((0, 1.90e-06), 8.10e-06), 1.28e-05), 1.90e-05)

编写装饰器以使其正确处理递归的优雅方法是什么?显然,如果是定时函数,您可以包装调用:

@timed
def wrapper():
    return rec(3)

这将给出结果和时间的元组,但我希望所有这些都由装饰器处理,以便调用者不需要担心为每个调用定义一个新函数。有想法吗?


这里的问题实际上并不在于装饰器。问题是rec needs rec是一个以一种方式运行的函数,但你想要rec成为一个行为不同的函数。没有干净的方法可以将其与单一的调和rec功能。

最干净的选择是停止要求rec同时成为两件事。不使用装饰器符号,而是分配timed(rec)改成不同的名字:

def rec(n):
    ...

timed_rec = timed(rec)

如果你不想要两个名字,那么rec需要编写以了解装饰的实际价值rec将返回。例如,

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

Python 装饰器对递归函数进行计时 的相关文章

  • 如何使用 Plotly 中的直方图将所有离群值分入一个分箱?

    所以问题是 我可以在 Plotly 中绘制直方图 其中所有大于某个阈值的值都将被分组到一个箱中吗 所需的输出 但使用标准情节Histogram类我只能得到这个输出 import pandas as pd from plotly import
  • 在 Python distutils 中从 setup.py 查找脚本目录的正确方法?

    我正在分发一个具有以下结构的包 mymodule mymodule init py mymodule code py scripts script1 py scripts script2 py The mymodule的子目录mymodul
  • if 语句未命中中的 continue 断点

    在下面的代码中 两者a and b是生成器函数的输出 并且可以评估为None或者有一个值 def testBehaviour self a None b 5 while True if not a or not b continue pri
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • 在flatpak项目中使用scrapy脚本

    我正在构建一个 flatpak 构建的项目 我有一个按钮 当单击它时我希望它运行 scrapy 脚本来抓取数据 窗口用户界面
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • 使用 Firefox 绕过弹出窗口下载文件:Selenium Python

    我正在使用 selenium 和 python 来从中下载某些文件web page http www oceanenergyireland com testfacility corkharbour observations 我之前一直使用设
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 在Python中按属性获取对象列表中的索引

    我有具有属性 id 的对象列表 我想找到具有特定 id 的对象的索引 我写了这样的东西 index 1 for i in range len my list if my list i id specific id index i break
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户

随机推荐

  • 切换到GLSL 300时,遇到以下错误

    当我切换到使用 OpenGL ES 3 和 GLSL 300 时 我在碎片着色器中遇到以下错误 未声明的标识符 gl FragColor 当使用 GLSL 100 时 一切都很好 现代版本的 GLSL 只需将片段着色器声明为out价值观 以
  • 如何将单元测试改造到代码库中?

    您是否有任何策略可以将单元测试改造到当前没有单元测试的代码库上 Read 有效地处理 Feathers 的遗留代码 吉米 博加德有一个关于 SOC 的好博客系列
  • 如何使用单个数组实现三个堆栈

    我在一个面试网站上遇到了这个问题 该问题要求在单个数组中有效地实现三个堆栈 以便在整个数组空间中没有剩余空间之前堆栈不会溢出 对于在数组中实现 2 个堆栈 这是非常明显的 第一个堆栈从左到右增长 第二个堆栈从右到左增长 当 stackTop
  • Android Firebase - 无法使用 getUid() 获取用户 ID - 错误:空对象引用

    我正在使用 Firebase 并且注册 登录活动工作正常 但我也希望每个用户更新用户名 看来我无法运行 firebaseRef getAuth getUid 我在应用程序模拟器中收到错误 不幸的是 应用程序已停止 这看起来像是我在 andr
  • jQuery Ajax 和重定向来自服务器的响应

    我有一种情况 我发送 jquery ajax post 请求 但在我的 web 应用程序中 该特定 ajax 请求的处理程序 处理 post 参数后 将调用另一个控制器中的操作 不确定这是否称为重定向 该操作基本上呈现整个网站页面 如页面刷
  • 将 struct.unpack 从 python 2.7 移植到 3

    以下代码在 python 2 7 中运行良好 def GetMaxNoise data max noise for byte in data noise ComputeNoise struct unpack B byte 0 if max
  • Android Webview中视频只播放一次

    我成功地在 Android 中的 Webview 中播放来自 HTML5 内容的流式 Youtube 视频 但现在的问题是视频仅在第一次播放 在那之后VideoView仅转到视频文件的末尾 我尝试按照建议清除缓存here但没有运气 这个问题
  • DownloadFile 与 DownloadFileAsync

    我正在使用 WebClient DownloadFile 从 Web 服务器一次下载一个文件 但是 我想知道 线程被阻止 开发人员是否意味着应用程序不会响应 我尝试使用 WebClient DownloadFileAsync 但它不像 Do
  • 获取临时对象的地址

    5 3 1 一元运算符 第 3 节 一元 运算符的结果是指向其操作数的指针 操作数应为左值或合格的 ID 在这种情况下 应该 到底意味着什么 这是否意味着获取临时地址是错误的 我只是想知道 因为 g 只给我一个警告 而 comeau 拒绝编
  • 拉拉维尔。在具有关系的模型中使用scope()

    我有两个相关模型 Category and Post The Post模型有一个published范围 方法scopePublished 当我尝试获取该范围内的所有类别时 categories Category with posts gt
  • PDF 中需要 Arial 字体(BIRT pdf 渲染器,Linux)

    我使用 BIRT IDE 创建了一个 rptdesign 文件 该文件内容采用 Arial 字体 当我在 Windows 中将报告导出为 PDF 时 它工作正常 我使用默认的viewerServlet 来创建报告 但是当我将报告移动到Lin
  • 在 JavaScript 中实现单例的最简单/最干净的方法

    实现最简单 最干净的方法是什么单例模式在 JavaScript 中 我认为最简单的方法是声明一个简单的对象文字 var myInstance method1 function method2 function 如果您希望单例实例上有私有成员
  • 如何在 Python 中将列表分割成连续的非零整数组

    似乎无法在网上找到这方面的线索 并且我自己也无法弄清楚 所以 我将如何对列表进行切片 以便返回连续非零整数切片的列表 IE data 3 7 4 0 1 3 7 我想生产 slices 3 7 4 1 3 7 我尝试过各种迭代列表的方法 一
  • 如何向 UICollectionView 添加背景图像,该图像将滚动和缩放单元格

    我正在使用构建马赛克视图UICollectionView 我已经子类化了UICollectionViewFlowLayout布局一个可以滚动的固定网格水平和垂直 我还附上了一个UIPinchGestureRecognizer这样集合就可以缩
  • 带有 pandas 的多个堆叠条形图

    我正在尝试用 pandas 制作多个堆叠条形图 但遇到了问题 这是示例代码 import pandas as pd df pd DataFrame a 10 20 b 15 25 c 35 40 d 45 50 index john bob
  • IE8/9 中的 CORS 与 jQuery 和 XDomainRequest

    UPDATE 我强烈建议不要在 XDomainRequest 上投入任何时间 因为它是一个非常糟糕的实现 有很多限制 它基本上只适用于对非 ssl 服务器的 GET 请求 所以你不妨使用 jsonp 或其他什么 我正在使用 CORS 调用跨
  • 使 TinyMCE 图像选择对话框指向 Plone 上的默认文件夹

    克隆人 4 1 使 TinyMCE 图像选择器对话框指向站点默认文件夹 image bank 而不是当前文件夹的最简单方法是什么 这个 文件夹显示为相册将为 Plone 轻松提供基本的图像库支持 我希望能够实现这个功能 所有 Plone 开
  • SSIS - 再次出现内存不足错误

    我有 cca 25 个数据库 需要将其合并为 1 个数据库 首先 我尝试构建一个 ssis 包 它将每个表中的所有数据复制到一个地方 但随后出现错误 信息 缓冲区管理器的内存分配调用失败 10485760 字节 但无法交换任何缓冲区来缓解
  • 可能的 Java 编译器错误!程序无法使用某些编译器编译

    首先 介绍一点背景知识 如果不感兴趣 可以跳过一点 我很生气又很困惑 这应该是一个非常简单的用例 而且确实是我的代码has使用 Eclipse JDT 编译器编译得很好 所以到目前为止我一直在配置 Maven 以确保做到这一点 尽管它不能使
  • Python 装饰器对递归函数进行计时

    我有一个简单的装饰器来跟踪函数调用的运行时 def timed f def caller args start time time res f args end time time return res end start return c