首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过隐式地知道在Python中回调/调用函数是什么,在函数中计算更少的最干净的方法?

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

Stack Overflow用户
提问于 2014-08-02 22:01:12
回答 1查看 62关注 0票数 2

我想到的具体用例是,假设我有两个矩阵,如

代码语言:javascript
复制
A = [[1, 1], [1, 1]]
B = [[2, 2], [2, 2]]

我想写一个像multiply这样的函数来计算它们的点积如下:

代码语言:javascript
复制
def multiply(X, Y):
    # some code to compute the ij-th entry of the resultant matrix
    return result

然而,在此计算之后,请立即说明我正在应用跟踪操作(对角线条目的和)。很明显,我对结果矩阵中那些不是对角线的条目毫不在意。因此,我的问题是,Python中最干净的方法是告诉multiply,它将返回的唯一操作将是只需要结果的一小部分的操作(以便只计算结果)。我想到的第一件事是

代码语言:javascript
复制
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

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-02 22:05:26

我看不出有一种清晰的方法可以知道在后面调用哪个函数,就像在您的示例中一样。

在代码trace(multiply(A, B))中,乘()函数是在 trace()之前调用的,而不是由 trace()调用的

在CPython中,如果您想知道调用方函数,那么https://docs.python.org/2.7/library/sys.html#sys._getframe函数可以帮助您:

代码语言:javascript
复制
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)

这些指纹:

代码语言:javascript
复制
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)函数,而不是试图拼凑出自动检测。

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

希望这会有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25099798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档