performance - 我们应该将可以在 O(1) 中获取的变量传递给嵌套函数,还是在每个嵌套函数中调用该函数?
问题描述
下面的例子最好地解释了这个问题。哪个是标准的:(A)还是(B)?
A)在每个嵌套函数中传递变量:def bar(X, y, n_rows, n_cols):
# Do stuff....
return stuff
def foo(X, y, n_rows, n_cols):
stuff = bar(X, y, n_rows, n_cols)
# Do stuff...
return stuff
B) 在每个嵌套函数中调用 O(1) 函数:
def bar(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
# Do stuff....
return stuff
def foo(X, y):
n_rows = get_number_of_rows(X) # X.shape[0]
n_cols = get_number_of_cols(X) # X.shape[1]
stuff = bar(X, y)
# Do stuff...
return stuff
将行数和列数传递给嵌套函数似乎有点冗长,但另一方面,继续设置变量似乎效率低下。我什至不太确定是否可以在恒定时间 O(1) 内获取行数和列数。我用 Python 写了这个(实际上使用 R),但我的目标是把这个问题概括得足够笼统,使它可以应用于任何语言。
有用的链接:
是否有关于函数应该接受多少参数的指南?(建议将此作为对象以避免多个参数)
- 哪个可读性更好?
- 哪个性能更好?
- 我们应该以一种永远不会出现这种情况的方式编码吗?
- (1) 和 (2) 的答案是否会因不同的语言而不同?
PS 这个问题的命名需要一点帮助——不那么冗长,更通用。
解决方案
我觉得
B
是首选,因为它避免了更改参数数量或名称的一些问题。选项A
有一个代码气味数据块,并且B
是他的解决方案,称为保留整个对象。两种方法都有
trump data
气味。这可以通过重新设计 OO 并使传递的变量成为类的成员来解决。或者引入全局变量或上下文变量(但这种情况很少见)如果没有不需要的副作用或按值复制大对象,则可以忽略性能。我建议您在开发时遵守以下规则:不要过早优化。
“从不”这个词不适用于软件设计。这一切都取决于上下文。
我认为是这样,不仅针对不同的语言,还针对在一种语言的框架内解决的问题、使用的工具、库、框架等。
推荐阅读
- firebase - 调用我的 Firebase 函数时出错。TypeError:无法读取 /user_code/node_modules/cors/lib/index.js:219:39 处未定义的属性“来源”
- amazon-web-services - AWS SSM put 参数验证异常
- python - Discord.py 表情符号映射到未定义
- c# - Swift 类型别名的 C# 等效项
- scala - 尽管配置了 logback,但 Play 2.6x Scala 应用程序不记录
- javascript - 如何在反应中修复大树结构
- ios - 如何在 swift/ios 中获取设备设置时间?
- ruby-on-rails - 自定义巫术的 require_login 函数
- java - “。”的目的是什么?范围?
- python - from flask_session import Session 产生 ImportError: cannot import name want_bytes