Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最佳实践:如何向函数传递多个参数?_Python_Algorithm_Optimization - Fatal编程技术网

Python 最佳实践:如何向函数传递多个参数?

Python 最佳实践:如何向函数传递多个参数?,python,algorithm,optimization,Python,Algorithm,Optimization,我正在运行一些数值模拟,其中我的主函数必须接收大量的参数——我说的是10到30个参数,这取决于要运行的模拟 处理此类案件的最佳做法是什么?比如说,将代码分成10个函数,每个函数有3个参数,在我的例子中听起来不太可行 我要做的是创建一个类的实例(没有方法),将输入存储为该实例的属性,然后传递该实例-因此函数只接收一个输入 我喜欢这一点,因为代码看起来干净、易于阅读,而且我发现定义和运行替代方案很容易 我不喜欢它,因为在函数中访问类属性比访问局部变量(请参见:)要慢,而且因为它不是一种有效的内存使用

我正在运行一些数值模拟,其中我的主函数必须接收大量的参数——我说的是10到30个参数,这取决于要运行的模拟

处理此类案件的最佳做法是什么?比如说,将代码分成10个函数,每个函数有3个参数,在我的例子中听起来不太可行

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

我喜欢这一点,因为代码看起来干净、易于阅读,而且我发现定义和运行替代方案很容易

我不喜欢它,因为在函数中访问类属性比访问局部变量(请参见:)要慢,而且因为它不是一种有效的内存使用方式—不必要地多次存储了太多数据

有什么想法或建议吗

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

我不认为这真的是一个堆栈溢出问题,更多的是一个软件工程问题。比如说

至于这是否是一个好的设计模式,这是一个处理大量参数的极好方法。你提到这在内存或速度方面不是很有效,但我认为你在进行不恰当的微优化

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

除非您运行了一个分析器,并确定访问该选项类的成员会减慢您的速度,否则我不会为此担心。这是特别的情况,因为您使用的是Python。如果速度是一个真正的问题,你应该使用其他东西

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


我推荐阅读,众所周知,“过早优化是万恶之源”。

你可以像这样输入字典:

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)
或者您可以使用几个命名元组,如此处引用的:

还要注意,根据您使用的python版本,可以传递到函数调用中的参数数量可能会有限制

或者你可以只用一本字典:

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

对不起,我不确定我是否听懂了。将对象分组到底是什么意思?这是一种非常常见的方法,您可以在这里了解更多:是的,我熟悉“过早优化”的概念,并且我知道numpy和许多其他库是用更快的语言编译的;在我原始帖子的链接中,一个使用局部变量的差异示例导致了30%的速度差异,这在我的文章中已经足够重要了case@Pythonistaanonymous你是否真的运行了一个探查器来确定这是否与你的玩具示例无关?至于内存,我想另一种方法是为不占用大量内存空间的属性设置一个输入类,为占用大量内存空间的属性设置另一个输入类——通常是一个几百MB的大数据帧。这样我就不会不必要地多次存储这个大数据帧。代码会变得更详细,更难阅读,所以我必须仔细考虑利弊的平衡。是的,我记不住确切的结果,但我记得分析器显示,从类中获取属性花费了很多时间。这个特定部分可以通过创建从类中读取的局部变量来解决,如玩具示例中所示。