在Python中向函数传递太多参数

在Python中向函数传递太多参数,python,performance,arguments,simulation,python-internals,Python,Performance,Arguments,Simulation,Python Internals,我正在开发一个程序,该程序对渗滤系统进行蒙特卡罗模拟(使用python)。为了能够从GUI(tkinter)运行它并使用多个进程,我在main()函数中定义了模拟的主要部分。问题是,这个程序是一个物理模拟,它需要很多参数(10+)。从main()调用的一些函数也需要很多参数,并且会被多次调用。例如,在我的main()中,我有一个generate_wire()函数,它接受8个参数,例如wires_mean_length、wires_distribution等。这个函数被调用了数百万次 这会影响项目

我正在开发一个程序,该程序对渗滤系统进行蒙特卡罗模拟(使用python)。为了能够从GUI(tkinter)运行它并使用多个进程,我在main()函数中定义了模拟的主要部分。问题是,这个程序是一个物理模拟,它需要很多参数(10+)。从main()调用的一些函数也需要很多参数,并且会被多次调用。例如,在我的main()中,我有一个generate_wire()函数,它接受8个参数,例如wires_mean_length、wires_distribution等。这个函数被调用了数百万次

这会影响项目的效率吗?这是应该修复的吗?如果是,如何修复

编辑:代码的结构基本如下:

def生成_线(“8个参数”):
“根据参数生成导线”
def main(“主要参数”):
对于范围内的(nbr sim):
尽管如此:
生成_线(“从主参数中选取8个参数”)
“各种计算”
如果渗流为真:
打破
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
“GUI代码”
“运行按钮使用GUI条目中的参数调用主函数”

实际上,与其他设计相比,这不会影响程序的运行时间

您可以将所有参数放入字典或自定义类中,并将其传递,以使逻辑更清晰

您可以将函数中的逻辑直接提升到循环中,这样可以减少查找的次数

def generate_wire_wrapper(“8个参数”):
对于范围内的(nbr sim):
“生成导线的逻辑”
“各种计算”
def main(“主要参数”):
生成\u wire\u wrapper(“8个参数取自主参数”)
然而,改进设计将是您在这里的真正盟友

与其在一个循环中调用同一个函数数千次,不如考虑

  • 使用某种类型的a来并行处理
  • 利用C语言中的逻辑(如果必须的话,也可以编写逻辑),使操作更加高效 科学图书馆的制图方法这样做是为了提高效率,其中一部分是通过每一步做更多的工作来规避GIL(例如,熊猫数据帧
    。应用
    方法就是这样做的)

请展示一些代码或研究,是的,它可能会影响性能!对于你的回答现在我开始明白我不知道效率,但是我知道多个参数可能不是一个问题,除了组织可能,如果计算过程没有以图形方式显示(也许只是结果),那么效率应该不会很低,但是对于大循环来说,这将需要一些时间(无法准确地说出多少,实际上可以测量)实际上,计算没有显示,只存储结果。测量它是一个好主意,我会尝试一下。我已经运行了一个foo函数100000次。一旦使用globals,另一个将15个参数传递给该函数。我没有得到两个过程之间的任何显著时间差。当然,这并不能证明什么,但我认为h方法是相当有效的。谢谢!我曾想过在措辞中传递它,但想知道它是否真的会在语言方面产生影响efficiency@Ethalides可能不是,这与创建一个新文件并从中导入数据几乎是一样的,这并不慢,或者我不知道python如何处理导入参数和数据字典等都是通过引用的,因此它们只会产生查找名称所指内容的成本。获得它们所需的参数和深度越多,您需要付出的成本就越高。但是,查找成本非常小,并且在使用函数变量时比不使用函数变量时效率更高(奇怪的是,将导入方法作为参数可以使它们更有效,因为这样可以避免查找)。感谢您的全面回答!问题是我无法并行运行此函数,因为我需要每次迭代的先前结果(每次添加导线时,我都在检查是否存在渗流路径)。不过我喜欢包装解决方案!我肯定会研究pandas,事实上我应该早一点做。@Ethalides随时-如果你发现每一步都依赖于前一步,可能有一些方法可以一次计算更多并展开循环。如果你能举一个最小的例子,这可能是一个令人兴奋/有价值的问题!pandas及其
df.apply
只是这项技术的一个例子,因此它可能根本不适用。但如果您有大量数据,它肯定会为您提供一个很好的解决方案。