这是一个关于Sage的问题,Sage基于Python 2.7。我已经写下了圣人问题here ,但会修改该问题以删除数学上下文。
我正在尝试针对非常特定的情况提高一些慢速函数的速度。
本质上,我有一个函数 foo
,这样 foo(args)
传统上相当慢,但是由于我手动完成的分析, foo( args')
可以通过 bar(args')
轻松计算(对于在实践中易于检查的 args'
的特殊情况)。我想要一个新版本的 foo
这样:
- 如果
args == args'
,(或args in A
,其中A
是包含所有输入的数据结构bar
是正确的)它只是调用bar(args)
- 否则,它会调用
foo(args)
现在,如果 foo
只是在我自己的代码中定义,则修复起来很简单(通过修改定义或可能的装饰器)。
我的问题是 foo
位于 module1
(不是我的代码)中。 module2
也导入 foo
,并且我希望此更改对 module2
中的所有内容都可见(本质上,我自己从不调用 >foo
,因此为了实现加速,我需要其他函数来更快地计算特定情况)。
我有自己的代码,可以导入 module1
和 module2
。有没有办法可以修改 foo
(在我自己的代码中)以更快地处理这种特殊情况,以便当 module1
和 module2
中的函数时> 称之为他们也会获得加速吗?仅当可以在不修改 module1
和 module2
源代码的情况下这才真正有用。
编辑
根据下面的答案,是否有方法可以在 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/