我想到的具体用例是说我有两个矩阵
A = [[1, 1], [1, 1]]
B = [[2, 2], [2, 2]]
我想写一个像multiply
这样的函数来计算它们的点积:
def multiply(X, Y):
# some code to compute the ij-th entry of the resultant matrix
return result
但是在这个计算之后立即说我正在应用跟踪操作(对角线项的总和)。那么显然我不太关心结果矩阵中不是对角线的条目。所以我的问题是,在 Python 中最简洁的方法是什么来告诉 multiply
对它将返回的内容的唯一操作将是一个只需要结果的一小部分的操作(以便只计算该结果)。我首先想到的是类似
def multiply(X, Y, only_diag=False):
if only_diag:
# only return i, j entries
else:
# return all entries
result = trace(multiply(A, B, only_diag=True))
不过,我很想知道是否有一种方法可以实现 multiply
,这样它就可以将函数 trace
识别为调用者函数,因此它知道隐含性only_diag=True
。
谢谢:)
最佳答案
我没有看到像您的示例那样知道之后调用哪个函数的简洁方法。
在代码 trace(multiply(A, B))
中,multiply() 函数在 trace( ) 而不是被调用 trace()。
在 CPython 中,如果您想知道调用函数,那么 sys._getframe()功能 可以帮助:
import sys
from inspect import getframeinfo
def multiply(X, Y):
print getframeinfo(sys._getframe(1))
def trace(Z):
pass
def multiply_then_trace(X, Y):
Z = multiply(X, Y)
return trace(Z)
if __name__ == '__main__':
A = [[1, 1], [1, 1]]
B = [[2, 2], [2, 2]]
multiply_then_trace(A, B)
这打印:
Traceback(filename='/Users/raymond/Documents/tmp3.py',
lineno=11,
function='multiply_then_trace',
code_context=[' Z = multiply(X, Y)\n'],
index=0)
要实现更快代码执行的目标,最简单的方法就是编写一个具有自定义优化代码的 trace_multiply(X, Y)
函数并显式调用它,而不是试图拼凑自动检测。
另一种选择是使用矩阵乘法的惰性求值。这样,您就可以跳过以后不需要的乘法部分。
希望这有帮助:-)
关于python - 通过隐式知道 Python 中的回调/调用函数是什么来减少函数计算的最简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099798/