你的两个函数没有理由期望执行相同的任务,更别说具有相同的性能特征了。
def test_function(A = value()):
#rest of function....
这个函数没有所谓的"关键字参数",它只有一个带有默认值的参数。任何函数的任何参数(除了一些顽固的内建函数)都可以通过关键字或位置传递,但是参数本身并不是"关键字参数"。
关键字参数和默认值之间唯一的联系是:当您有多个带有默认值的参数时,如果想为后面的参数提供明确的值而接受前面的参数的默认值,则必须通过关键字传递后面的参数。
这两个函数之间的巨大区别在于,当您为 A
声明一个默认值时,它是一个默认值,而不是一些代码,如果未提供明确值,则每次都会重新生成该值。当您这样说时:
def test_function(A = value()):
#rest of function....
你正在为
A
设置一个默认的
值。和任何其他上下文一样,当你在需要提供一个值给Python时,如果你提供一个复杂表达式,Python会计算这个表达式并使用结果值。因此,在函数定义时设置
A
的默认值,它将被设置为那个时间
value()
返回的任何值。然后,这一个单独的值就是
A
的默认值。
def test_function():
A = value()
#rest of function ...
在这个函数中,每次调用该函数都会评估
value()
。因此,如果
value()
很耗费时间,那么这个版本将比第一个版本需要更长的时间。但是,如果
value()
返回的是一个您稍后会改变的对象,则默认参数版本将始终使用单个对象,无论在调用函数时处于什么状态,而第二个版本将每次构造一个新的
value
对象。哪个版本应该使用取决于您希望程序具有的语义。
value()
的道德准则。如果这是一些随机 id 生成器,您将会遇到麻烦。那个 id 将永远默认存在。因此请确保通过调用 value() 来检查您的应用程序是否正常。 - User007fast_function
的速度优化,用于处理仅限位置参数调用,如果函数对象缺少默认参数或单元格变量/自由变量设置,则使用PyEval_EvalCodeEx
。否则,它将使用PyEval_EvalCodeEx
。我的测试表明,在没有默认值和有默认值的情况下,使用255个参数可以提高约5-7%的性能。但更重要的是,使用255个关键字参数的速度要慢12-13倍,因为使用关键字进行调用需要更多的工作来设置和评估。 - Eryk Sun