簡體   English   中英

scipy.weave.inline的性能

[英]Performance of scipy.weave.inline

我是一位Python新手,正在嘗試學習一些有關這種出色的編程語言的知識。 我嘗試使用scipy.weave.inline來加快一些計算。 只是為了學習一點,我嘗試使用scipy.weave.inline實現矩陣乘法。 我沒有包括任何錯誤處理-只是嘗試以更好地理解它。 代碼如下:

import scipy.weave
def cmatmul(A,B):
    R = numpy.zeros((A.shape[0],B.shape[1]))
    M = R.shape[0]
    N = R.shape[1]
    K = A.shape[1]

    code = \
    """
    for (int i=0; i<M; i++)
        for (int j=0; j<N; j++)
            for (int k=0; k<K; k++)
                R(i,j) += A(i,k) * B(k,j);
    """
    scipy.weave.inline(code, ['R','A','B','M','N','K'], \
                       type_converters=scipy.weave.converters.blitz, \
                       compiler='gcc')
    return R

當我與numpy.dot進行比較時,我發現weave.inline版本花費的時間大約是numpy.dot的50倍。 我知道numpy可以應用時非常快。 對於大型矩陣(例如1000 x 1000),甚至可以看到這種差異。

我已經檢查了numpy.dot和scipy.weave.inline,在計算時似乎都使用了一個核心100%。 Numpy.dot提供了10.0 GFlop,而我的筆記本電腦的理論值為11.6 GFlop(雙精度)。 我以單精度測量了預期的雙重性能。 但是scipy.weave.inline落后了。 scipy.weave.inline的性能的1/50倍。

這種差異是可以預期的嗎? 或者我做錯了什么?

您實現了一個朴素的矩陣乘法算法,該算法將scipy.weave編譯為快速的機器代碼。

但是,存在用於矩陣乘法的非顯而易見的,CPU緩存效率更高的算法 (通常將矩陣拆分為塊並進行處理),並且可以通過特定於CPU的優化來獲得更高的速度。 如果已安裝Numpy,默認情況下將使用優化的BLAS庫進行此操作。 與無需進行大量研究即可自行編寫的代碼庫相比,這些庫可能會更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM