通过隐式知道Python中的回调/调用函数是什么,在函数中计算更少的最简洁方法?

时间:2014-08-02 22:01:13

标签: python continuations

我想到的具体用例就是说我有两个矩阵,比如

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} }}

谢谢:)

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)函数,该函数具有自定义优化代码并显式调用它,而不是试图拼凑自动检测。

另一种选择是使用矩阵乘法的惰性求值。这样,您可以跳过以后不需要的乘法部分。

希望这会有所帮助: - )