@staticmethod 在 CPython 或 Micropython 中保存任何内存吗?

2024-02-25

在回答最近的问题时,我重复了我的假设,即使用的一个原因@staticmethod是为了节省内存,因为静态方法只被实例化一次。这个断言可以在网上很容易找到(例如here https://newbedev.com/what-is-the-advantage-of-using-static-methods-in-python)而且我不知道我第一次遇到它是在哪里。

我的推理基于两个假设,其中一个是错误的: python在实例化一个类时实例化了所有方法(事实并非如此,稍加思考就会发现,哎呀)和b。静态方法没有在访问时实例化,而是直接调用。因此我认为这段代码:

import asyncio

class Test:
    async def meth1():
        await asyncio.sleep(10)
        return 78
t1= Test()
t2 = Test()
loop = asyncio.get_event_loop
loop.create_task(t1)
loop.create_task(t2)

def main():
    for _ in range(10):
        await asyncio.sleep(2)

loop.run(main())

比我这样定义类会使用更多的内存:

class Test:
    @staticmethod
    async def meth1():
        await asyncio.sleep(10)
        return 78

是这样吗?静态方法会在访问时实例化吗?做类方法在访问时实例化?我知道t1.meth1 is t2.meth1将返回True在第二种情况下和False在第一个中,但这是因为 python 正在实例化meth1第一次然后第二次查找它,或者因为在这两种情况下它只是查找它,或者因为在这两种情况下它都会获得静态方法的副本,该副本在某种程度上是相同的(我认为不是这样?)id静态方法的 似乎没有改变:但我不确定我对它的访问正在做什么。

如果是这样的话,现实世界有理由关心吗?我在 micropython 代码中看到了大量的静态方法,其中异步代码中同时存在多个实例。我以为这是为了节省内存,但我怀疑我错了。我很想知道 micropython 和 Cpython 实现之间是否有任何区别。

Edit我的想法是正确的t1.meth1() and t2.meth1()将绑定该方法twice首先并且once在第二?


方法不会被“实例化”,它们会被绑定——这是“它们的self/cls参数已填充”,类似partial参数绑定 https://docs.python.org/3/library/functools.html#functools.partial。整个点staticmethod是没有self/cls参数,因此不需要绑定。

事实上,获取一个staticmethod什么都不做——它只是返回函数不变:

>>> class Test:
...     @staticmethod
...     async def meth1():
...         await asyncio.sleep(10)
...         return 78
...
>>> Test.meth1
<function __main__.Test.meth1()>

由于方法是按需绑定的,因此它们通常不以绑定形式存在。因此,仅仅拥有方法就不需要支付内存成本,而无需支付任何内存成本。staticmethod来弥补。自从staticmethod是查找过程中的一个实际层 - 即使它什么都不做 - 无论哪种方式(不)使用都不会带来性能增益staticmethod.

In [40]: class Test:
    ...:     @staticmethod
    ...:     def s_method():
    ...:         pass
    ...:     def i_method(self):
    ...:         pass
    ...: 

In [41]: %timeit Test.s_method
42.1 ns ± 0.576 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [42]: %timeit Test.i_method
40.9 ns ± 0.202 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

请注意,这些时间可能会因实施和测试设置而略有不同。结论是,这两种方法的速度相当快,并且性能与选择其中一种方法无关。


¹staticmethod作为描述符 https://docs.python.org/3/reference/datamodel.html#object.__get__每次查找方法时都会运行。

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

@staticmethod 在 CPython 或 Micropython 中保存任何内存吗? 的相关文章

  • Python正则表达式替换除特定单词之外的所有内容

    我正在尝试执行以下操作用正则表达式 import re x re compile going you words to replace s I am going home now thank you string to modify pri
  • 使用 JPype - 如何访问 JDBC 元数据函数

    我在用着杰 德贝API https launchpad net jaydebeapi它使用 JPype 加载 FileMaker 的 JDBC 驱动程序并提取数据 但我也希望能够获取所有表的列表在数据库中 In the JDBC 文档 ht
  • Firefox 中的文件下载对话框

    我正在使用firefox进行selenium python编程 自动开始下载并保存文件 我已经完成了所有操作 但无法下载csv文件 我的python版本是2 6 6 我的selenium版本是最新版本 我也尝试使用以下链接 即 fp web
  • 扭曲多种协议

    我希望为我正在从事的项目学习扭曲 该项目需要服务器响应 HTTP 请求以及通过 TCP 连接的其他协议 Twisted能够同时处理多种协议吗 我想使用 Twisted Web 来帮助处理 HTTP 但同时需要响应其他端口上的 TCP 连接
  • 如何从 Windows 7 PC 上完全卸载 Python 2.7

    从这里安装了Python 2 7 https www python org downloads release python 279 https www python org downloads release python 279 然后我
  • 打开文件路径在 python 中不起作用[重复]

    这个问题在这里已经有答案了 我正在编写一个数据库程序 personica 是我的测试主题 我通常在文件路径的位置有一个变量 但出于测试和演示的目的 我只有一个字符串 在我的计算机上的这个确切位置有一个文本文件 顺便说一句 因为我很偏执 所以
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • Python 中 eval("input()") 和 eval(input()) 之间的区别

    我正在尝试以下功能 x eval input 输入为 123 x 的类型也是int 它工作正常 In 22 x eval input enter enter 123 In 24 print type x
  • 使用 python boto3 管理 Route53 中具有多个 IP 的 A 记录

    我的route53中有一条A记录 后面有多个IP 例子 A record dummy xyz com 点IPs 1 1 1 1 2 2 2 2 和 3 3 3 3路由策略 Simple 我使用下面的代码来更新单个 IP 的记录 Change
  • LogRecord 没有预期的字段

    在使用 logging 模块的Python中 文档承诺LogRecord实例将具有许多属性 这些属性在文档中明确列出 然而 情况似乎并不总是如此 当我不使用日志记录模块的 basicConfig 方法时 下面的程序显示属性 asctime
  • pandas groupby 并转换为 json 列表

    我有一个如下所示的 pandas 数据框 idx f1 f2 f3 1 a a b 2 b a c 3 a b c 87 e e e 我需要将其他列转换为基于索引列的字典列表 所以 最终结果应该是 idx features 1 f1 a f
  • 如何在 Python 中连接两个列表?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在 Python 中连接两个列表 Example listone 1 2 3 lis
  • Python-使用元组作为列表索引[重复]

    这个问题在这里已经有答案了 我有一个元组列表 tuples list 1 0 2 3 3 2 2 0 我想访问二维数组的元素a例如 使用其中一些元组 for i in range 3 print a tuples list i 应该输出的值
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • 如何在 Windows 7 中使用 Python 廉价地创建非常大的文件? [复制]

    这个问题在这里已经有答案了 可能的重复 在Windows系统上快速创建大文件 https stackoverflow com questions 982659 quickly create large file on a windows s
  • 如何仅在按下某个键时触发鼠标单击?在Python中

    我想制作一个程序 或者当我单击某个键时 鼠标会自动单击 只要我单击该键 如果我不单击该键 它就会停止 我不希望只在触摸按键一次时才发生点击 而是只要按住按键就发生点击 也可以像雷蛇突触鼠标一样按下鼠标左键触发点击 任何想法 EDIT 1 这
  • Python struct.pack() 'struct.error: bad char in struct format' 尝试保存字节顺序时

    我正在尝试打包一个字符串和字符串的长度 fmt
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • `numpy.diff` 和 `scipy.fftpack.diff` 在微分时给出不同的结果

    我正在尝试计算一些数据的导数 并且正在尝试比较有限差分的输出和谱方法的输出 但结果却截然不同 我无法弄清楚到底为什么 考虑下面的示例代码 import numpy as np from scipy import fftpack as sp
  • 如何通过解析导入来组合并获取单个 Python 文件

    我正在尝试获取单个 Python 文件作为输出 我有一个 Python 脚本 其中有多个此类导入 from that import sub 导入来自所有本地模块 而不是来自系统或 Python 库 有什么方法可以解决这些问题并获得一个完整的

随机推荐

  • 将列表传递给 Tcl 过程

    将列表传递给 Tcl 过程的规范方法是什么 如果我能得到它 以便列表自动扩展为可变数量的参数 我真的很喜欢它 所以像这样 set a b c myprocedure option1 option2 a and myprocedure opt
  • 在 IE 和 Chrome 中上传之前预览图像

    我正在尝试设计一个模块 在用户将图像上传到数据库之前 我想在其中向用户显示图像的预览 我找到了一个适用于 Firefox 但不适用于 IE 和 Chrome 的解决方案 有人可以帮助我吗 这是我的代码 function imageURL i
  • 这个空白隐藏在哪里?

    我有一个字符向量 它是一些 PDF 抓取的文件pdftotext 命令行工具 一切都 幸福地 排列得很好 然而 该向量充满了一种空白类型 无法使用正则表达式 gt test 1 Address Clinic Information Stor
  • whereis python 和 python --version 之间的矛盾

    在一个 Python 环境中 我输入whereis python 并得到以下信息 python usr bin python2 6 usr bin python2 6 config usr bin python usr lib python
  • 如何通知用户NPM包版本更新?

    我用 Node JS 编写了一个 CLI 工具并发布到NPM https www npmjs com package rapid react 每次在终端中运行时 我都需要通知用户可用的新版本及其类型 补丁 次要 主要 以便他 她可以相应地更
  • 如何计算时间复杂度为 O(n log n) 的 XOR(二元)卷积

    是按位异或运算 我认为Karatsuba算法可能可以解决该问题 但是当我尝试在Karatsuba算法中使用XOR代替 时 很难得到子问题 The 卷积定理 https en wikipedia org wiki Convolution th
  • 为什么在 Python 中处理已排序数组并不比处理未排序数组快?

    在这篇文章中为什么处理排序数组比处理随机数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an unso
  • flink kafka生产者在检查点恢复时以一次模式发送重复消息

    我正在写一个案例来测试 flink 两步提交 下面是概述 sink kafka曾经是kafka生产者 sink stepmysql接收器是否扩展two step commit sink comparemysql接收器是否扩展two step
  • 如何构建多部分 MIME 请求并使用 AngularJS 的 $http 方法 POST 它?

    如何构建多部分 MIME 请求并使用 AngularJS http 方法将其 POST 到服务器 API 我正在尝试将图像上传到服务器 图片的二进制数据应该是body使用 POST 方法和多部分 MIME 完成请求 其余查询参数可以作为查询
  • 使用简单 Json 库提取 JSON 数组

    我的 JSON 数据如下所示 Users Username Admin1 Password 123 Username Admin2 Password 456 Username Admin3 Password 789 我正在尝试提取所有用户名
  • Java:如何从线程返回中间结果

    使用Java 7我正在尝试构建一个监视数据存储 某些集合类型 的观察程序 然后在某些点从其中返回某些项目 在本例中 它们是时间戳 当时间戳经过当前时间时 我希望将其返回到起始线程 请参阅下面的代码 Override public void
  • 通过 LDAP 连接到 Active Directory

    我想使用 C 连接到我们的本地 Active Directory 我发现了这个很好的文档 http ianatkinson net computing adcsharp htm 但我真的不知道如何通过 LDAP 连接 你们有人能解释一下如何
  • 如何限制角度摘要仅影响/重新渲染一个组件/指令

    我正在开发一个有角度的应用程序 网站 现在才意识到 每当触发模型更改 摘要时 它都会导致整个页面重新渲染 这看起来既浪费又缓慢 有没有办法导致 限制摘要仅影响它所使用的指令 控制器 例如 如果我有一个带有 interval 的 时钟 指令来
  • 重新加载 Web 项目时 Visual Studio 2019 值未落在预期范围内

    我刚刚升级到VS2019 Pro 我正在设置新的溶液过滤器功能允许我仅使用我正在处理的项目的依赖项来部分加载我的解决方案 并在加载 或重新加载 ASP Net MVC Web 项目时遇到问题 看这里 https youtu be u5Yau
  • auth.getAccessTokenAsync 的 Outlook 插件错误代码 13005

    所以我尝试在 Outlook 插件中使用单点登录 我已在以下位置注册了我的应用程序https apps dev microsoft com https apps dev microsoft com 在我的清单中我有
  • Rails:强制用户在保存父对象之前创建子对象

    我是 Ruby on Rails 的初学者 目前 我遇到以下问题 我有一堂课Game有一系列图片和句子交替出现 我希望创建新的用户Game需要给出一张起始图片或句子 如果他不这样做 我不想将新创建的游戏保存到数据库中 class Game
  • subl 在这里做什么?

    所以 我正在使用 gcc S O2 m32 编译成汇编程序 void h int y int x x y 1 f y f 2 它给了我以下内容 file sample c text p2align 4 15 globl h type h f
  • 有没有办法直接在类属性中使用bootstrap 5自定义颜色?

    就像我们一样 span class text primary some text span 我想知道是否有办法做到 span class text red 300 some text span red 300 是 bootstrap 5 自
  • 共享常量池?

    与 Java 虚拟机相比 Dalvik 虚拟机获得 共享常量池 意味着什么 这是什么好处 Dalvik 机器如何实现这一点 Java 虚拟机将每个类存储在单独的 class 文件中 每个类文件都有一个常量池 用于存储字符串 方法名称 类名称
  • @staticmethod 在 CPython 或 Micropython 中保存任何内存吗?

    在回答最近的问题时 我重复了我的假设 即使用的一个原因 staticmethod是为了节省内存 因为静态方法只被实例化一次 这个断言可以在网上很容易找到 例如here https newbedev com what is the advan