python - 通过隐式知道 Python 中的回调/调用函数是什么来减少函数计算的最简洁方法?

标签 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 识别为调用者函数,因此它知道隐含性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/

相关文章:

haskell - 延续作为有意义的理解

python - 解析 json 响应时对象不可调用 python

python - 删除重复的 2D numpy.array

functional-programming - 了解 Racket 中的移位/重置

haskell - 使用延续monad在 `Set`(和其他具有约束的容器)上构造有效的monad实例

scala - 在while循环中使用Scala延续

python - 以相同顺序打印列表的最大值而不创建新列表

python - 为什么 Stackdriver 日志中会间歇性地出现空行?

python - 如何将二元类 Logistic 回归与 Python 合并

haskell - callCC是如何用严格的函数式语言实现的?