我想到的具体用例是,假设我有两个矩阵,如
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。
谢谢:)
发布于 2014-08-02 22:05:26
我看不出有一种清晰的方法可以知道在后面调用哪个函数,就像在您的示例中一样。
在代码trace(multiply(A, B))中,乘()函数是在 trace()之前调用的,而不是由 trace()调用的。
在CPython中,如果您想知道调用方函数,那么https://docs.python.org/2.7/library/sys.html#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)函数,而不是试图拼凑出自动检测。
另一种选择是使用矩阵乘法的延迟求值。这样,您就可以跳过以后不需要的乘法部分。
希望这会有所帮助:)
https://stackoverflow.com/questions/25099798
复制相似问题