亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號