我注意到,尽管听起来很奇怪,但mpmath的性能取决于是否安装了sagemath,而与当前会话中是否加载了sage模块无关。特别是,我在使用多精度浮点数的操作中体验到了这一点。
示例:
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是完全相同的
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)。
发布于 2021-05-27 08:46:23
我找到解释了。在/usr/lib/python3.9/site-packages/mpmath/libmp/backend.py中,第82行有
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,并将其设置为后端。这意味着接下来将加载以下库:
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。
https://stackoverflow.com/questions/67713952
复制相似问题