这是一个关于Sage的问题,它基于Python 2.7。我已经写了圣训问题here,但会修改这个问题以删除数学背景。
我正在尝试为特定情况提高一些慢速功能的速度。
从本质上讲,我有一个函数foo
,因此传统上foo(args)
很慢,但是由于我手工完成的分析,foo(args')
可以通过{{1}轻松计算(对于bar(args')
的特殊情况,在实践中很容易检查)。我希望有args'
的新版本:
foo
,(或args == args'
,其中args in A
是包含所有输入A
的某些数据结构是正确的),则只需调用bar
< / LI>
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' objects}
。
鉴于此,我尝试了以下,但没有奏效。
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: can't set attributes of built-in/extension type 'sage.libs.cypari2.gen.gen
答案 0 :(得分:1)
import module1
origfoo = module1.foo
def myfoo(*args):
if args in A:
return bar(*args)
return origfoo(*args)
module1.foo = myfoo
在此之后导入module1
的任何模块都将获取该功能的修改版本。如果module1
本身在您有机会应用修补程序之前导入module2
,则可能会出现问题。