【问题标题】:Optimal way of defining constants in a python function在 python 函数中定义常量的最佳方法
【发布时间】:2016-05-25 08:10:16
【问题描述】:

这可能是一个比实际问题更理论的问题,因为它不会对程序的运行时间产生显着影响。至少对我来说不是。

我收到了一些导入不同(“自制”)函数的 python 代码。一个函数(称为 func)从主脚本(称为 ma​​in)中调用了 5 次。

func中,很多常量都定义在函数的开头。例如:

    import numpy as np
    def func(x,y,z):
        c0 = np.array([1,2,3])
        c1 = np.array([1,2,3])
        c2 = np.array([1,2,3])
        c3 = np.array([1,2,3])

        #do stuff with variables x,y,z
        #return stuff

我想知道:调用这个函数时,是每次调用函数时定义的常量c0,...,c3,还是在运行ma​​in 脚本,以便它们只定义一次?

【问题讨论】:

  • 在 func 中定义一个数组可能不是一个很大的性能问题,从语义上讲,如果它是唯一使用它们的函数,那么它们应该留在那里是有争议的。但是,在函数中导入 numpy 看起来很糟糕......

标签: python functional-programming


【解决方案1】:

c0c1等的范围仅限于func方法。因此,每次调用函数时,这些变量都会被初始化

如果你希望它们只初始化一次,然后每次调用都在func中使用,你可以在func方法之外定义:

import numpy as np

c0 = np.array([1,2,3])
c1 = np.array([1,2,3])
c2 = np.array([1,2,3])
c3 = np.array([1,2,3])

def func(x,y,z):

    #do stuff with variables x,y,z
    #return stuff

【讨论】:

  • 重点是它们是常量。它们在函数中获取常量性质的唯一方法是在函数外部声明它们?
【解决方案2】:

是的,每次调用函数时都会定义它们。

Python 的动态特性意味着np.array 的值可能在函数定义和调用之间(以及调用之间)之间发生了变化,因此编译器没有机会“提前”评估它们。

如果将它们保存在闭包中,则可以使它们只被评估一次,而无需将它们作为全局变量引入。

例子:

def _func():
    c0 = np.array([1,2,3])
    c1 = np.array([1,2,3])
    c2 = np.array([1,2,3])
    c3 = np.array([1,2,3])
    def actual_func(x, y, z):
        # do stuff
        # return stuff
    return actual_func

_func_closure = _func()

def func(x, y, z):
    return _func_closure(x, y, z)

最后一个定义只是为了避免从函数中创建一个全局变量 - 如果您不介意,func = _func() 也同样适用。

这可能写得更优雅,但它说明了这个想法,它本质上是“添加一个间接级别”。

免责声明:我完全不知道这是否有更好的性能。

(如果你对这样的“技巧”感兴趣,任何一本像样的 Lisp 书籍中都有很多内容。)

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多