为什么在python中安装sagemath会提高mpmath的性能?

为什么在python中安装sagemath会提高mpmath的性能?,python,sage,mpmath,Python,Sage,Mpmath,我注意到,尽管听起来很奇怪,但mpmath的性能取决于是否安装了sagemath,而不管当前会话中是否加载了sage模块。特别是,我在使用多个精度浮点的操作中体验到了这一点 例如: 从mpmath导入mp 导入时间 mp.prec=650 t=time.time() 对于范围内的i(1000000): x_-mpmath+y_-mpmath w=时间。时间() 打印('plus:\t',(w-t),'μs') t=time.time() 对于范围内的i(1000000): x_-mpmath*y

我注意到,尽管听起来很奇怪,但mpmath的性能取决于是否安装了sagemath,而不管当前会话中是否加载了
sage
模块。特别是,我在使用多个精度浮点的操作中体验到了这一点

例如:

从mpmath导入mp
导入时间
mp.prec=650
t=time.time()
对于范围内的i(1000000):
x_-mpmath+y_-mpmath
w=时间。时间()
打印('plus:\t',(w-t),'μs')
t=time.time()
对于范围内的i(1000000):
x_-mpmath*y_-mpmath
w=时间。时间()
打印('times:\t',(w-t),'μs')
#如果安装了sagemath:
#加:0.129199504852292μs
#次数:0.17601895332336426μs
#
#如果sagemath*未*安装:
#加:0.6239776611328125μs
#时间:0.6283771991729736μs
而在这两种情况下,模块mpmath是完全相同的

import mpmath
print(mpmath.__file__)
# /usr/lib/python3.9/site-packages/mpmath/__init__.py
我认为mpmath的后端将依赖于一些sagemath依赖项,如果缺少这些依赖项,它将返回到一个优化程度较低的依赖项,但我无法准确地找出它是什么。我的目标是能够只安装所需的包来加速mpmath,而不是安装所有sagemath


由于这很可能取决于打包方式,您可能需要了解我的系统的详细信息:我使用的是Arch Linux,所有软件包都更新到了最新版本(sagemath 9.3、mpmath 1.2.1、python 3.9.5)。

我找到了解释。在第82行的
/usr/lib/python3.9/site packages/mpmath/libmp/backend.py

如果操作系统环境中没有“MPMATH\u NOSAGE”:
尝试:
进口鼠尾草
将sage.libs.mpmath.utils作为_sage_utils导入
sage=sage.all
sage_utils=_sage_utils
后端='sage'
MPZ=sage.Integer
除:
通过
如果安装了sagemath,则会加载所有sage,并将其设置为后端。这意味着接下来将加载以下库:

        import sage.libs.mpmath.ext_libmp as ext_lib
来自第1407行的
/usr/lib/python3.9/site packages/mpmath/libmp/libmpf.py
。通过查看该模块的
\uuu文件
,可以看到它是一个
.so
对象,因此经过编译,因此速度更快


这也意味着,通过将
MPMATH\u NOSAGE
导出到任何非空值,将强制后端成为默认值(python或gmpy),事实上,我可以确认,即使安装了sagemath,我在问题中编写的代码在这种情况下也会运行得较慢。

可能会比较
{k:getattr(v,'.\u file\uuuuuuuuuuuuuuuuu','(内置)'))对于sys.modules.items()}
中的k,v,在这两种会话中?这也可能受到
sys.path
或每个包
\uuuu path\uuuu
的影响,但我希望这只会在冷启动时产生影响。@o11c确实,感谢您的评论,我发现mpmath在内部加载sage并将其用作后端。