最佳实践:如何将许多参数传递给函数?

时间:2019-03-25 14:24:53

标签: python algorithm optimization

我正在运行一些数值模拟,其中我的主函数必须接收很多参数-我要说的是10到30个参数,具体取决于要运行的模拟。

有哪些处理此类情况的最佳做法? 在我看来,将代码分成10个函数(每个函数带有3个参数)听起来不太可行。

这不是这类问题的最佳论坛吗,您能建议在哪里提问吗?

我要做的是创建一个类的实例(没有方法),将输入存储为该实例的属性,然后传递该实例-这样该函数仅接收一个输入。 >

我之所以喜欢这样,是因为代码看起来干净,易于阅读,并且因为我发现它易于定义和运行替代方案。

我不喜欢它,因为在函数中访问类属性比访问局部变量要慢(请参阅:How / why to optimise code by copying class attributes to local variables?),并且因为它不能有效地使用内存-太多数据不必要地存储多次。

有什么想法/建议/建议吗?非常感谢!

myinput=MyInput()
myinput.input_sql_table = that_sql_table
myinput.input_file = that_input_file
myinput.param1 = param1
myinput.param2 = param2
myoutput = calc(myinput)

替代方案:

inputs=collections.OrderedDict()
scenarios=collections.OrderedDict()
inputs['base scenario']=copy.deepcopy(myinput)

inputs['param2 = 100']=copy.deepcopy(myinput)
inputs['param2 = 100'].param2 = 100
# loop through all the inputs and stores the outputs in the ordered dictionary scenarios

2 个答案:

答案 0 :(得分:2)

我不认为这确实是一个StackOverflow问题,更多的是软件工程问题。例如check out this question

就这是否是一种好的设计模式而言,这是处理大量参数的一种极好的方法。您提到,这在内存或速度方面不是很有效,但是我认为您在进行不正确的微优化。

就内存而言,运行Python解释器的开销将使实例化类所使用的两个额外字节相形见

除非您已经运行了探查器并确定访问该选项类的成员使您减速,否则我不必担心。尤其是这种情况,因为您正在使用Python。如果速度是您真正关心的问题,则应该使用其他方法。

您可能没有意识到这一点,但是大多数用于Python的大规模运算库实际上并不是用Python编写的,它们只是C / C ++库的包装,速度更快。

我建议您阅读this article,这是众所周知的:“过早的优化是万恶之源”。

答案 1 :(得分:1)

您可以像这样传递字典:

all_the_kwargs = {kwarg1: 0, kwarg2: 1, kwargN: xyz}
some_func_or_class(**all_the_kwargs)

def some_func_or_class(kwarg1: int = -1, kwarg2: int = 0, kwargN: str = ''):
    print(kwarg1, kwarg2, kwargN)

或者您可以使用几个命名的元组,如此处引用:Type hints in namedtuple

还请注意,取决于所使用的python版本,可以传递给函数调用的参数数量可能会受到限制。

或者您也可以只使用字典:

def some_func(a_dictionary):
   a_dictionary.get('argXYZ', None) # defaults to None if argXYZ doesn't exist