为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 gmpy2 在复数求幂时如此慢?

为什么 gmpy2 在复数求幂时如此慢?

慕娘9325324 2023-08-15 17:02:31
我在 gmpy2 中使用复数并注意到它很慢。我缩小了求幂运算符的范围。起初我以为这只是因为它很复杂。但后来我将它与使用gmpy2 的 mpmath 进行了比较,发现速度要快得多:# tested using gmpy2 2.0.8, mpmath 1.1.0, python 3.8.5>>> import timeit>>> setup = '''import gmpy2 as gmimport mpmatha1 = gm.mpc(-12.5, 34.125)a2 = gm.mpc(17, -45.875)b1 = mpmath.mpc(-12.5, 34.125)b2 = mpmath.mpc(17, -45.875)'''# using gmpy2>>> timeit.timeit('a1 ** a2', setup)87.13848301399992>>> timeit.timeit('a1 ** 2', setup)40.478690218>>> timeit.timeit('pow(a1, 2)', setup)40.70392542999991# using mpmath>>> timeit.timeit('b1 ** b2', setup)51.799312732999965>>> timeit.timeit('b1 ** 2', setup)4.239320562999978>>> timeit.timeit('pow(b1, 2)', setup)4.293315565000057# multiplication comparison>>> timeit.timeit('a1 * a1', setup)0.9900801109999975  # gmpy2>>> timeit.timeit('b1 * b1', setup)4.711916033999955  # mpmath纯复数幂运算非常慢,但 mpmath 仍然比 gmpy2 快 40% 左右。由于 mpmath 是 Python,我认为它会慢得多,但事实显然并非如此。gmpy2 怎么这么慢?
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我很好奇造成差异的原因。我进行了四次不同的测试。


# Reference test on Windows 10 that used the same gmpy2

# binaries.


>>> timeit.timeit('a1 ** a2', setup)

60.565931600000006

>>> timeit.timeit('a1 ** 2', setup)

25.686232700000005

>>> timeit.timeit('pow(a1, 2)', setup)

25.684606899999977

>>> timeit.timeit('b1 ** b2', setup)

35.29716189999999

>>> timeit.timeit('b1 ** 2', setup)

2.6226074000000494

>>> timeit.timeit('pow(b1, 2)', setup)

2.6126720999999975

>>>

>>> import gmpy2

>>> gmpy2.version()

'2.0.8'

>>> gmpy2.mp_version()

'MPIR 2.7.2'

>>> gmpy2.mpfr_version()

'MPFR 3.1.4'

>>> gmpy2.mpc_version()

'MPC 1.0.3'

>>>

结果与问题中的结果类似。我打印了底层库的版本。


# Test using WSL with latest Ubuntu version. Same physical

# system as above.


>>> timeit.timeit('a1 ** a2', setup)

31.21574370000002

>>> timeit.timeit('a1 ** 2', setup)

2.3873958000000357

>>> timeit.timeit('pow(a1, 2)', setup)

2.3556844999999953

>>> timeit.timeit('b1 ** b2', setup)

36.35650579999998

>>> timeit.timeit('b1 ** 2', setup)

2.4482329999999592

>>> timeit.timeit('pow(b1, 2)', setup)

2.431874800000003

>>>

>>> import gmpy2

>>> gmpy2.version()

'2.1.0b3'

>>> gmpy2.mp_version()

'GMP 6.2.0'

>>> gmpy2.mpfr_version()

'MPFR 4.0.2'

>>> gmpy2.mpc_version()

'MPC 1.1.0'

>>>

我选择 WSL 是因为它很容易在 Windows 10 上安装。gmpy2并且mpmath使用sudo apt install python3-gmpy2和进行安装sudo apt install python3-mpmath。gmpy2比 稍快一些mpmath。


# Test using Hyper-V virtual machine under Windows Server 2016.

# Different physical system but identical specifications.


>>> timeit.timeit('a1 ** a2', setup)

27.467059508984676

>>> timeit.timeit('a1 ** 2', setup)

2.171035467006732

>>> timeit.timeit('pow(a1, 2)', setup)

2.193065536994254

>>> timeit.timeit('b1 ** b2', setup)

31.870763173996238

>>> timeit.timeit('b1 ** 2', setup)

2.019194034015527

>>> timeit.timeit('pow(b1, 2)', setup)

2.0843256690131966

>>> 

>>> import gmpy2

>>> gmpy2.version()

'2.1.0b5'

>>> gmpy2.mp_version()

'GMP 6.2.0'

>>> gmpy2.mpfr_version()

'MPFR 4.0.2'

>>> gmpy2.mpc_version()

'MPC 1.1.0'

>>> 

我在之前的测试中使用了最新的测试版。结果与Ubuntu版本相同。总体而言,比 WSL 稍快一些。


# Same as above but using gmpy2 2.0.8 instead of 2.1.0b5.


>>> timeit.timeit('a1 ** a2', setup)

23.692542312986916

>>> timeit.timeit('a1 ** 2', setup)

9.208024947001832

>>> timeit.timeit('pow(a1, 2)', setup)

9.388882965984521

>>> timeit.timeit('b1 ** b2', setup)

32.078784318000544

>>> timeit.timeit('b1 ** 2', setup)

2.027712993003661

>>> timeit.timeit('pow(b1, 2)', setup)

2.123160599003313

>>> 

>>> import gmpy2

>>> gmpy2.version()

'2.0.8'

>>> gmpy2.mp_version()

'GMP 6.2.0'

>>> gmpy2.mpfr_version()

'MPFR 4.0.2'

>>> gmpy2.mpc_version()

'MPC 1.1.0'

>>>

2.0.8最后两个测试显示了和版本之间的差异2.1.0。我对参数处理进行了重大更改。mpc ** int速度快得多,但mpc ** mpc速度稍慢。(我想我可以修复这个回归......)


Windows 二进制文件使用旧版本的底层库。我正在研究基于使用 mingw-w64 编译器编译的最新版本 GMP、MPFR 和 MPC 的 Windows 二进制文件。GCC 编译器将允许 GMP 自动为不同的 CPU 选择正确的代码路径。


更新1


我已经优化过了mpc ** mpc,并且mpc ** int. 的性能回归mpc ** mpc已得到修复,并且mpc ** int速度更快。


查看完整回答
反对 回复 2023-08-15
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信