考虑具有默认参数的典型函数:
def f(accuracy=1e-3, nstep=10):
...
Run Code Online (Sandbox Code Playgroud)
这很紧凑,易于理解.但是,如果我们有另一个功能g
,将来电f
,我们要传递的一些参数g
来f
?这样做的一种自然方式是:
def g(accuracy=1e-3, nstep=10):
f(accuracy, nstep)
...
Run Code Online (Sandbox Code Playgroud)
这种做法的问题在于可选参数的默认值会重复出现.通常在传播这样的默认参数时,需要在上部函数(g
)中使用与下部函数(f
)中相同的默认值,因此任何时候默认更改都f
需要通过调用它的所有函数并更新默认值他们将传播给他们的任何论据f
.
另一种方法是使用占位符参数,并在函数内填写其值:
def f(accuracy=None, nstep=None):
if accuracy is None: accuracy = 1e-3
if nstep is None: nstep=10
...
def g(accuracy=None, nstep=None):
f(accuracy, nstep)
...
Run Code Online (Sandbox Code Playgroud)
现在调用函数不需要知道f
默认值是什么.但是f
界面现在有点麻烦,而且不太清楚.这是没有显式默认参数支持的语言中的典型方法,如fortran或javascript.但是如果一个人在python中以这种方式完成所有事情,那么就会丢掉大部分语言的默认参数支持.
有没有比这两个更好的方法?这样做的标准,pythonic方式是什么?
我有大量的小型线性方程组,我想使用 numpy 有效地解决它们。基本上,给定A[:,:,:]
和b[:,:]
,我希望找到x[:,:]
给定的A[i,:,:].dot(x[i,:]) = b[i,:]
。所以如果我不关心速度,我可以解决这个问题
for i in range(n):
x[i,:] = np.linalg.solve(A[i,:,:],b[i,:])
Run Code Online (Sandbox Code Playgroud)
但是由于这涉及 python 中的显式循环,并且由于A
通常具有类似 的形状(1000000,3,3)
,因此这种解决方案将非常缓慢。如果 numpy 不能做到这一点,我可以在 fortran 中执行此循环(即使用 f2py),但如果可能,我更愿意留在 python 中。
我正在使用scipy.sparse.linalg.cg
解决一个大的,稀疏的线性系统,并且它工作正常,除了我想添加进度报告,以便我可以在求解器工作时监视残差.我已设法设置回调,但我无法弄清楚如何从回调内部访问当前残差.当然,计算剩余是可能的,但这是一个相当繁重的操作,我想避免.我错过了什么,或者没有有效的方法来获取残差?