【发布时间】: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