我们应该将可以在 O(1) 中获取的变量传递给嵌套函数,还是在每个嵌套函数中调用该函数?

Should we pass a variable that can be acquired in O(1) into nested functions, or recall that function within every nested function?

下面的例子最好地解释了这个问题。哪个是标准的:(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),但我的目标是足够通用地构建这个问题,以便它可以应用于任何语言。

有用的链接:
Are there guidelines on how many parameters a function should accept?(建议将其设为对象以避免使用多个参数)

问题:
  1. 哪个可读性更好?
  2. 哪个性能更好?
  3. 我们是否应该以一种永远不会出现这种情况的方式进行编码?
  4. (1) 和 (2) 的答案是否会因不同的语言而有所不同?

P.S。在这个问题的命名方面需要一点帮助——不那么冗长更通用。

我认为

  1. B 是首选,因为它避免了一些更改参数数量或名称的问题。选项 A 有代码味道 data clumps, and B is his solution called preserve whole object

    而且这两种方法都有 trump data 的味道。这可以通过使 OO re-design 并使传递的变量成为 class 的成员来解决。或者引入全局或上下文变量(但这种情况相当罕见

  2. 如果没有不需要的副作用或按值复制大对象,那么性能可以忽略不计。我建议您在开发时遵守以下规则:Don't do premature optimization.

  3. “从不”一词不适用于软件设计。这完全取决于上下文。

  4. 我是这么认为的,不仅针对不同的语言,还针对在一种语言的框架内解决的问题,使用的工具,库,框架等等