第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Cython 比 Numpy 慢(來自 Python Cookbook 的示例)

Cython 比 Numpy 慢(來自 Python Cookbook 的示例)

繁星點點滴滴 2021-11-30 19:27:30
該片段來自 Python Cookbook 一書。有三個文件。樣本.pyxcimport cython@cython.boundscheck(False)@cython.wraparound(False)cpdef clip(double[:] a, double min, double max, double[:] out):    if min > max:        raise ValueError('min must be <= max')    if a.shape[0] != out.shape[0]:        raise ValueError('input and output arrays must be the same size!')    for i in range(a.shape[0]):        if a[i] < min:            out[i] = min        elif a[i] > max:            out[i] = max        else:            out[i] = a[i]setup.pyfrom distutils.core import setupfrom Cython.Build import cythonizesetup(ext_modules=cythonize("sample.pyx"))和 main.py 作為測試文件b = np.random.uniform(-10, 10, size=1000000)a = np.zeros_like(b)since = time.time()np.clip(b, -5, 5, a)print(time.time() - since)since = time.time()sample.clip(b, -5, 5, a)print(time.time() - since)令人驚訝的是,Numpy 的運行速度比 Cython 代碼快 2 倍,而這本書聲稱恰恰相反。我機器上的性能是:0.00352168083190917970.00608062744140625這是為什么?
查看完整描述

1 回答

?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊

我可以確認(rèn)你的結(jié)果(numpy 1.15 vs Cython 0.28.3 + gcc-5.4):


>>>  %timeit sample.clip(b, -5, 5, a)

20.5 ms ± 230 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)

>>>  %timeit np.clip(b, -5, 5, a)

11.7 ms ± 312 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

很難說為什么食譜的作者有其他時間:其他 numpy 版本或其他編譯器。在這種情況下,np.clip除了使用 SIMD 指令外,沒有太大的改進(jìn)空間。


但是,您的 Cython 代碼不是最佳的。您可以通過聲明內(nèi)存視圖是連續(xù)的 iedouble[::1]而不是double[:]. 這會產(chǎn)生一個 cythonized C 代碼,它更容易為編譯器優(yōu)化(有關(guān)更多信息,請參閱此SO-question):


cpdef clip2(double[::1] a, double min, double max, double[::1] out):

   ....


>>>  %timeit sample.clip2(b, -5, 5, a)

11.1 ms ± 69.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

這大約與 numpy 版本一樣快。


但是,為了獲得最佳結(jié)果,我會推薦Numba:使用Numba獲得更好的性能比使用 Cython 容易得多(參見例如這個SO-question):


import numba as  nb  

@nb.njit

def nb_clip(a, min, max, out):


    if min > max:

        raise ValueError('min must be <= max')


    if a.shape[0] != out.shape[0]:

        raise ValueError('input and output arrays must be the same size!')


    for i in range(a.shape[0]):

        if a[i] < min:

            out[i] = min

        elif a[i] > max:

            out[i] = max

        else:

            out[i] = a[i]


 ...

 %timeit nb_clip(b, -5, 5, a)

 4.7 ms ± 333 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Numba 和原始 Cython 版本之間的性能差異在這里是由于 clang(這是 Numba 用于編譯的)在這種特殊情況下能夠生成比 gcc 更好的匯編程序。當(dāng)我在 Cython 中切換到 clang-5.0 時,我可以匹配(甚至略微擊敗)Numba。


查看完整回答
反對 回復(fù) 2021-11-30
  • 1 回答
  • 0 關(guān)注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號