我想到的具体用例就是说我有两个矩阵,比如
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
识别为调用函数,因此隐含它知道{{1} }}
谢谢:)
答案 0 :(得分:1)
我没有看到一个简洁的方法来知道事后调用哪个函数,如你的例子所示。
在代码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)
函数,该函数具有自定义优化代码并显式调用它,而不是试图拼凑自动检测。
另一种选择是使用矩阵乘法的惰性求值。这样,您可以跳过以后不需要的乘法部分。
希望这会有所帮助: - )