【问题标题】:Python: Confused about what and what should not be defined inside a functionPython:对函数内部不应该定义什么和不应该定义什么感到困惑
【发布时间】:2020-08-09 13:23:49
【问题描述】:

这本质上是一个关于从开始到结束的执行(处理)时间方面优化代码的问题。

我目前正在通过我自己承担的一个项目来学习 Python,因为我很想了解有关该语言的更多信息。这是一个基于物理的问题(我不在学校,这对我来说是一种爱好),并且不涉及细节,它涉及计算二维函数的值(以两个变量作为输入)。函数的域是一个矩形网格,定义在大约 200x200 点处,在每个点我都需要评估所述 2D 函数。

现在,要获得一个 (x,y) 坐标,我需要执行一些更深入的计算(取决于其他参数)。我不能只选择 (x,y) 的任意值。所以它需要一些计算 - 阅读:处理时间 - 得到 (x,y),然后我需要评估该坐标上的实际 2D 函数。

这是我的问题:我应该在代码中的单独函数中自己计算 (x,y) 坐标,还是应该让 2D 函数调用另一个每次计算 (x,y) 网格的函数?

从示意图上看,这里有两种选择:

(1) xlist 和 ylist 都是一次性计算出来的

def definitions():

    xlist = [ get the values for the x-coordinate ]

    ylist = [ get the values for the y-coordinate ]

    return(xlist,ylist)

def main(xlist,ylist,other parameters):

    # use xlist and ylist in calculations

    return (value of 2D-function at position (x,y))

getcoords = definitions()

for a, b, c in loop:

    result = main(getcoords,a,b,c...)

    write(result onto file)

-- 或者--

(2) 每次调用main函数时重新计算xlist和ylist

def main(a, b, c, ...):

    def definitions():

        xlist = [ get the values for the x-coordinate ]

        ylist = [ get the values for the y-coordinate ]

        return(xlist,ylist)

    getcoords = definitions()

    value = ... # use xlist and ylist in calculations

    return (value)

for a, b, c in loop:

    result = main(a,b,c...)

    write(result onto file)

我的问题源于我多次听到的口头禅,即 python 处理局部变量比全局变量快得多,在第一个示例中,x 和 y 列表是全局的并且需要“运送到" 每次使用时的功能?可能比第二个示例花费更多的时间来执行,其中列表完全是本地的,即使每次调用函数时都重新定义它们?

这个问题的表述是否恰当?例如,如果有其他我不知道的因素影响,请告诉我,但我只是想知道它是否总体上有利,一次又一次地重新定义函数内部的列表,或者更确切地说定义它们一次并继续调用它们在函数定义中。也许那里有更好的例子?

提前致谢!

PS。这些“更深入的计算”的示例涉及使用 scipy 插值来评估此处未提及的函数,以便找到 (x,y)。

【问题讨论】:

  • 关注点分离的概念:“不同的职责应该进入应用程序的不同组件、层或模块。程序的每个部分应该只负责一个部分功能(我们称之为它的关注点),并且应该对其余部分一无所知。”。所以分成不同的功能,这也使每个功能更可重用。另外,现阶段不用担心优化Why Premature Optimization Is the Root of All Evil

标签: python list function


【解决方案1】:

我一般不能回答这个问题,因为它取决于计算坐标与访问次数相比的复杂性。我认为第一个更快,但没有证据,只有我的直觉。但是,您可以使用 timeit 并尝试两种选择,如果这在代码方面不是太麻烦的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多