返回实例列表没有什么区别吗?那么性能呢?

2023-12-20

我刚刚意识到,对于我的程序中的特定模块,返回或不返回实例列表根本没有区别。使用固定种子,结果是相同的。

因此,我想知道:

  1. 包含 return 语句似乎是更好的编程实践。那是对的吗?

  2. 我主要担心的是性能。我很难计时,因为计算机中发生的其他事情似乎会影响结果。我得到了 4 分 3 秒,然后得到了 5 分钟,没有改变一个逗号。

请参阅下面的示例:

有一个从另一个模块调用的大型函数,并传递许多包含不同实例对象的列表:

def check_demographics(month, my_agents, families, firms, my_graveyard, year, mortality_men, mortality_women, fertility, state_id):

在该函数内我有以下函数:

def mortal(my_agents, my_graveyard, families, agent, firms):
    my_agents.remove(agent)
    my_graveyard.append(agent)
    families[agent.get_family_id()].death_member(agent)
    if families[agent.get_family_id()].num_members() == 0:
        families[agent.get_family_id()].empty_house()
    if agent.is_employed():
        firms[agent.get_workplace()].obit(agent)
    return my_agents, families, firms, my_graveyard 

在上面的例子中,我发现退货是可选的。返回包含代理人、家庭等的列表没有什么区别。

所以,我知道这个例子是不可重现的,但问题与一般事实有关。

我假设该列表位于内存中的某个位置。

附注我不是计算机科学家,而是试图进行一些基于代理的建模的研究人员。谢谢!


原则上,不返回任何东西会更快。实际上,这并不重要,而且是无用的微观优化。

Python 不会围绕物体移动,它会移动参考到对象(存储在名称中)。如果您有 C++ 背景,请考虑return a,b,c返回一个由三个指针组成的数组。与函数正在执行的所有其他显式操作相比,此操作的性能开销可以忽略不计。

如果您担心性能,您也不应该为程序计时。任何一个profile您的程序以找出您的程序中的位置大量时间被花费了。或者time测试代码以了解如何更好地执行关键代码(通过分析识别)。一个起点是timeit计时代码包,以及各种 python 分析器,例如vmprof.

例如,要找出的开销return一般来说,你可以安排明确的陈述:

$ python3 -m timeit -s 'def foo():' -s '  pass' 'foo()'
10000000 loops, best of 3: 0.0994 usec per loop
$ python3 -m timeit -s 'def foo():' -s '  return' 'foo()'
10000000 loops, best of 3: 0.0981 usec per loop
$ python3 -m timeit -s 'def foo():' -s '  return 1, 2' 'foo()'
10000000 loops, best of 3: 0.0961 usec per loop
$ python3 -m timeit -s 'bar, foo=object(), object()' -s 'def foo():' -s '  return foo, bar' 'foo()'
10000000 loops, best of 3: 0.136 usec per loop

无论你不返回,都不返回任何内容(隐含的None)或返回常量并不重要。如果您实际返回对象,则会增加大约 0.04 usec (!!!) 的开销。只是calling一个函数的性能成本已经是原来的 2.5 倍。

从编码风格的角度来看,IMO 认为 python 标准库的观点是最好的:如果就地更改了某些内容,则不要返回它。这强调了对象是通过副作用而改变的,并且没有必要创建对它们的新引用。

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

返回实例列表没有什么区别吗?那么性能呢? 的相关文章

随机推荐

  • 位移位大型二进制文件?

    在 C 中对大量二进制数据进行位移位的最佳或推荐方法是什么 我有一个 200K 二进制文件 我想左移然后右移整个文件 如果您的操作系统可以支持它 请使用内存映射文件 然后做一点移位就会非常非常高效 请参阅此答案以获取更多信息 内存映射文件有
  • browserify external 与 except 之间有什么区别?

    我在用着browserify并试图让它跳过浪费时间包括或解析 jquery 和其他require less 文件我通过 CDN 加载 我应该使用bundle exclude jquery or bundle external jquery
  • Apple iOS 浏览器随机不会呈现动态加载的 HTML 对象

    我们遇到的问题仅在 iOS 浏览器 iOS 12 0 上明显 我们的 SPA 应用程序使用 HTML 对象标签通过 JavaScript 将小部件 HTML CSS JS 文件 加载到页面上 该问题是间歇性的 当页面加载时 某些小部件不会在
  • 在 AWS DynamoDB 上存储聊天日志?

    我正在考虑使用 AWS DynamoDB 构建一个聊天应用程序 该应用程序将支持一对一和群聊 我想为每个聊天创建一个表 其中每个发送的聊天文本行都有一条记录 DynamoDB 适合这种工作吗 我也在考虑合并两个表 但是 如果 假设 有 10
  • MongoDB 身份验证错误

    连接 Mongodb 时出现此错误 我不太确定这个错误是什么 使用 CompositeServerSelector Selectors ReadPreferenceServerSelector ReadPreference Mode Pri
  • 并排对齐 2 个 div

    我需要并排对齐 2 个 div 它们都位于没有设置高度的包装 div 内 我的问题是 当我分别使用 float left 和 float right 时 div 似乎不会 留在 包装器 div 内 我可以看出 因为包装器 div 与页面具有
  • 如何保持 RxJ 干燥

    DRY 不要重复自己 假设我在我的应用程序中经常使用以下代码 observable pipe tap value gt console log value map value gt value 5 more repeated stuff 假
  • Angular 2自定义验证器:检查输入值是否为整数?

    在 Angular2 项目中 我需要验证一些输入 如何轻松检查输入值是否为整数 我尝试使用Number control value 返回0对于空的字段 不好 or parseInt control value 10 不考虑空格 如果我有类似
  • Microsoft.TeamFoundation.VersionControl.Client.ItemNotMappedException 即使工作区存在并且具有映射

    使用 TFS 2015 update 2 在计算机中安装代理 代理创建其工作区 内部开发的一些自定义 MSBuild 任务已在将在代理上运行的生成定义中实现 这些任务针对 TFS 服务器执行一些操作 当构建定义排队等待新构建时 我得到的是
  • 将语言包嵌入到应用程序中

    我正在制作一个使用离线语音识别的应用程序 来自 Google API 的 SpeechRecognizer 它工作得很好 但我需要在使用该应用程序之前下载语言包 所以 这是我的问题 有没有办法嵌入语言包并直接从我的应用程序安装它 或者从Pl
  • 如何在Java小程序中打开模式对话框?

    我正在尝试在前面显示一个模式对话框Applet 我当前的解决方案像这样获取根框架 Frame getMyParent Container parent getParent while parent instanceof Frame pare
  • Logstash - Memorize 插件的使用

    尝试使用 记忆 插件 如下所示 if message matching event grok match gt message mymatch datetime memorize field gt datetime if message a
  • 如何使 gcc 或 ld 报告未定义的符号但不失败?

    如果你用 GCC 编译一个共享库并传递 z defs 标志 我认为它只是盲目地传递给 ld 那么你会得到一个很好的报告 说明哪些符号未定义 并且 ld 失败 没有 so 文件 被建造 另一方面 如果您不指定 z defs 或显式指定 z n
  • 两个列表之间的交集 F#

    我正在寻找一个函数 它可以获取两个列表之间的交集并创建一个新列表 我有这个函数 let intersect x y Set intersect Set ofList x Set ofList y 可以实现我想要的功能 但我不想使用 F 中的
  • C#中ArrayList的初始大小是多少?

    我想知道C 中ArrayList的初始大小是多少 0 见下文 16 我必须为此答案添加字符 因为最少 18 个字符 编辑 哎呀 最初的capacity是16 初始大小当然是0 因为它是空的 必须学会如何阅读 或者你必须学习如何提出你的问题
  • 离线时 start_url 不会响应 200:start_url 确实响应,但不是通过服务工作线程响应。灯塔审计问题

    我正在创建一个与 Service Worker 一起离线工作的 PWA 目前它工作正常 但 Lighthouse Audit 存在问题 当我运行 Lighthouse 时 在 PWA 部分我遇到这个问题 离线时 start url 不响应
  • Shiny:使 renderUI 对下拉列表做出反应,而不是对 SubmitButton 做出反应

    如何让 renderUI 对用户从下拉列表中选择不同的值做出反应 而无需单击我的提交按钮 我有一个 wellPanel 其中包含 3 个内容 1 我的下拉列表2 一组动态输入 由我的 renderUI 函数创建 取决于 1 中的选择 3 提
  • Mysql索引配置

    我有一张满是新闻的 450000 行表 表架构是这样的 CREATE TABLE IF NOT EXISTS news id int 11 NOT NULL auto increment cat id int 11 NOT NULL tit
  • 指定哪些字段在 ElasticSearch 中建立索引

    我有一个包含许多我从不查询的字段的文档 因此我想关闭这些字段的索引以节省资源 我相信我需要禁用 all field http www elasticsearch org guide reference mapping all field h
  • 返回实例列表没有什么区别吗?那么性能呢?

    我刚刚意识到 对于我的程序中的特定模块 返回或不返回实例列表根本没有区别 使用固定种子 结果是相同的 因此 我想知道 包含 return 语句似乎是更好的编程实践 那是对的吗 我主要担心的是性能 我很难计时 因为计算机中发生的其他事情似乎会