2014-10-28 25 views
0

我一直在嘗試利用gmpy模塊時遇到速度問題。如何更快地創建gmpy數組操作?

import numpy as np 
import gmpy2 as gm 
N = 1000 
a = range(N) 
%timeit [gm.sin(x) for x in a] 
# 100 loops, best of 3: 7.39 ms per loop 
%timeit np.sin(a) 
# 10000 loops, best of 3: 198 us per loop 

我想知道如果我能以某種方式加速這種計算。我在想JIT或多處理可能會有幫助,但我還沒有想出如何去做。

任何幫助將不勝感激。如果您希望我發佈更多信息,請告訴我。

回答

2

我很想看看會有多大的性能提升,所以我寫了一個gmpy2的新函數,它完全用C計算了一個列表的sin。不幸的是,沒有太大的改進。

%timeit [gmpy2.sin(x) for x in a] 
100 loops, best of 3: 4.85 ms per loop 
%timeit map(gmpy2.sin, a) 
100 loops, best of 3: 4.59 ms per loop 
%timeit gmpy2.vector(a) 
100 loops, best of 3: 4.44 ms per loop 

gmpy2不釋放全局解釋器鎖(GIL),所以線程不會幫助。

多處理可能會有所幫助,但您可能需要並行執行幾秒(或更長)的代碼以克服將數據傳遞到另一個進程的開銷。

基於軟件的任意精度浮點只比本地浮點慢。

+0

謝謝你的回覆@casevh。我假設gmpy2.vector(a)是新函數?事實上,它似乎不是一個很快的速度。關於多處理,我一直在嘗試使用IPython的http://ipython.org/ipython-doc/stable/parallel/parallel_multiengine.html#quick-and-easy-parallelism框架。這應該是正確的? – evan54 2014-10-28 05:32:03

+0

是的,vector()是測試函數的名稱。我對缺乏加速感到失望。我很抱歉,但我不熟悉IPython的並行工具。 – casevh 2014-10-28 05:35:57

+0

非常感謝你。至少我知道嘗試使用某種JIT是不值得的。 – evan54 2014-10-28 05:43:17