gpt4 book ai didi

python - "Replacing"具体函数调用

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:49 24 4
gpt4 key购买 nike

这是一个关于Sage的问题,Sage基于Python 2.7。我已经写下了圣人问题here ,但会修改该问题以删除数学上下文。

我正在尝试针对非常特定的情况提高一些慢速函数的速度。本质上,我有一个函数 foo,这样 foo(args) 传统上相当慢,但是由于我手动完成的分析, foo( args') 可以通过 bar(args') 轻松计算(对于在实践中易于检查的 args' 的特殊情况)。我想要一个新版本的 foo 这样:

  1. 如果args == args',(或args in A,其中A是包含所有输入的数据结构bar 是正确的)它只是调用 bar(args)
  2. 否则,它会调用 foo(args)

现在,如果 foo 只是在我自己的代码中定义,则修复起来很简单(通过修改定义或可能的装饰器)。

我的问题是 foo 位于 module1 (不是我的代码)中。 module2 也导入 foo ,并且我希望此更改对 module2 中的所有内容都可见(本质上,我自己从不调用 >foo,因此为了实现加速,我需要其他函数来更快地计算特定情况)。

我有自己的代码,可以导入 module1module2。有没有办法可以修改 foo (在我自己的代码中)以更快地处理这种特殊情况,以便当 module1module2 中的函数时> 称之为他们也会获得加速吗?仅当可以在不修改 module1module2 源代码的情况下这才真正有用。

编辑

根据下面的答案,是否有方法可以在 Sage 中对 PARI 调用进行猴子修补?我尝试进行猴子修补的方法被探查器描述为 {method '_nf_rnfeq' of 'sage.libs.cypari2.gen.gen' object}。鉴于此,我尝试了以下方法,但没有成功。

import sage.libs.cypari2.gen
orig_nf_rnfeq = sage.libs.cypari2.gen.gen._nf_rnfeq
def _nf_rnfeq(*args, **kwargs):
print("Rnfeq works!")
return orig_nf_rnfeq(*args, **kwargs)

sage.libs.cypari2.gen.gen._nf_rnfeq = _nf_rnfeq

这会导致错误TypeError:无法设置内置/扩展类型'sage.libs.cypari2.gen.gen的属性

最佳答案

import module1
origfoo = module1.foo

def myfoo(*args):
if args in A:
return bar(*args)
return origfoo(*args)

module1.foo = myfoo

在此之后导入module1的任何模块都将采用您修改后的函数版本。如果在您有机会应用补丁之前 module1 本身导入 module2,您可能会遇到问题。

关于python - "Replacing"具体函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com