首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在python中安装sagemath可以提高mpmath的性能?

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

Stack Overflow用户
提问于 2021-05-27 07:35:37
回答 1查看 105关注 0票数 1

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

示例:

代码语言:javascript
复制
from mpmath import mp
import time
mp.prec = 650

t = time.time()
for i in range(1000000):
    x_mpmath + y_mpmath
w = time.time()
print('plus:\t', (w-t), 'μs')
t = time.time()
for i in range(1000000):
    x_mpmath * y_mpmath
w = time.time()
print('times:\t', (w-t), 'μs')

# If sagemath is installed:
# plus:  0.12919950485229492 μs
# times: 0.17601895332336426 μs
#
# If sagemath is *not* installed:
# plus:  0.6239776611328125 μs
# times: 0.6283771991729736 μs

而在这两种情况下,模块mpmath是完全相同的

代码语言:javascript
复制
import mpmath
print(mpmath.__file__)
# /usr/lib/python3.9/site-packages/mpmath/__init__.py

我认为mpmath的后端将依赖于一些sagemath依赖项,如果缺少它,它将返回到一个较不优化的后端,但我无法弄清楚它到底是什么。我的目标是能够只安装所需的软件包来加速mpmath,而不是安装所有的sagemath。

因为这很可能取决于如何打包,你可能需要了解我的系统的细节:我使用的是Arch Linux,所有的包都更新到了最新的版本(sagemath 9.3,mpmath1.2.1,python 3.9.5)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-27 08:46:23

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

代码语言:javascript
复制
if 'MPMATH_NOSAGE' not in os.environ:
    try:
        import sage.all
        import sage.libs.mpmath.utils as _sage_utils
        sage = sage.all
        sage_utils = _sage_utils
        BACKEND = 'sage'
        MPZ = sage.Integer
    except:
        pass

如果安装了sagemath,这将加载所有sage,并将其设置为后端。这意味着接下来将加载以下库:

代码语言:javascript
复制
        import sage.libs.mpmath.ext_libmp as ext_lib

来自/usr/lib/python3.9/site-packages/mpmath/libmp/libmpf.py的1407行。通过查看该模块的__file__,可以看到它是一个.so对象,因此进行了编译,因此速度更快。

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

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

https://stackoverflow.com/questions/67713952

复制
相关文章

相似问题

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