Most efficient way to pass multiple arguments to a function?
对于将大量用户输入变量作为参数传递给函数以及返回多个结果,最有效的方法(在处理速度和内存利用率方面)是什么?
每次调用函数时,一长串的参数和返回值——例如(a、b、c、d、e、f、g)=myfunction(a、b、c、d、e、f、g)——似乎都是不平等的,我猜测这也是低效的;特别是当我必须重复或递归调用函数时。
然而,将整个变量列表定义为函数外部的全局变量也很难看,而且随着程序的增长,变量名可能会被无意中分配给几个不同的变量。
我尝试将所有变量放入单个数组或列表中,并将其作为单个参数传递给函数,因为这看起来更整洁。我是否认为这样做更有效,即使对于大型数组也是如此,因为它只是每次传递给函数的数组开始的指针,而不是整个数组本身?如果数组是向函数传递大量变量/从函数传递大量变量的最佳方法,那么在什么情况下,这种节省效率的方法起作用呢?例如,如果参数的数目小于5,则传递一个字符串参数更好,如果需要5个或更多参数,则使用数组或列表更好吗?
先前关于StackExchange的讨论:将多个参数传递给函数的优雅方法建议使用结构而不是向量/数组来传递多个参数。为什么这种方法优先于使用数组,并且在什么时候效率节约可以证明使用struct增加的复杂性?
在Python或C/C++中,还有其他我应该考虑的方法吗?(例如,我不熟悉面向对象的编程,但想知道这是否可以提供一个具体的解决方案到Python?)
非常感谢
所有这些都依赖于目标系统及其函数调用约定。这个答案只适用于C和C++。
通常,使用文件范围变量通常是最快的。在这种情况下,变量不应声明为全局变量(整个项目中都可以访问),而应声明为静态变量(只能由本地文件访问)。
不过,应避免使用此类静态文件范围变量,原因有几个:它们会使代码更难读取和维护,随意使用可能导致"意大利面代码",它们会造成可重入性问题,并向文件范围命名空间添加一些额外的标识符。
应该注意的是,如果参数的数量有限,那么将它们作为单独的参数保存可能会提高性能,因为编译器随后会将其中一些参数存储在CPU寄存器中,而不是存储在堆栈中。CPU寄存器是向函数传递参数的最快方式。这是如何工作的是非常具体的系统。然而,在大多数情况下,以希望通过CPU寄存器传递参数的方式编写程序是预成熟的优化。
传递多个参数的最佳方式实际上是创建包含所有参数的自定义结构(或C++类)。然后通过对函数的引用传递此结构。尽量使结构只包含彼此相关的变量。考虑将彼此不相关的变量或仅对一个给定函数特殊的变量放在单独的参数中。在大多数情况下,良好的程序设计会取代效率。
为什么结构/类比数组更可取,原因很简单,因为变量一起形成了一个唯一的类型,而且它们可能具有不同的类型。创建一个所有变量都有不同类型的数组没有任何意义。
在C++中,类在数组上提供其他优点,例如构造函数和析构函数、自定义赋值操作符等。
这显然取决于您想要做什么,因为每个容器都有不同的用途。
当然,在处理速度和内存方面,应该使用指针或对容器的引用(结构、类、数组、元组…),以便不复制所有数据,而只复制容器的地址。
但是,不能创建一个结构,也不能将所有变量都放在同一个容器中,以便将它们作为函数的参数。您将放在数据结构上的所有变量都应该是相关的。
在您给出的示例中,有多个不同类型的变量。这就是为什么首选结构,因为数组要求所有参数都具有相同的类型。在python中,可以使用命名的tuple来存储不同的变量。