2

2 つの大きな行列の内積を計算しようとしています。numpy内積を計算しようとすると行列のコピーが作成されるようで、メモリの問題が発生します。numbaグーグルで調べた後、パッケージが有望であることがわかりました。しかし、私はそれを正しく動作させることはできません。これが私のコードです:

import numpy as np
from numba import jit
import time, contextlib



@contextlib.contextmanager
def timeit():
    t=time.time()
    yield
    print(time.time()-t,"sec")


def dot1(a,b):
    return np.dot(a,b)

@jit(nopython=True)
def dot2(a,b):
    n = a.shape[0]
    m = b.shape[1]
    K = b.shape[0]
    c = np.zeros((n,m))
    for i in xrange(n):
        for j in xrange(m):
            for k in range(K):
                c[i,j] += a[i,k]*b[k,j]

    return c



def main():
    a = np.random.random((200,1000))
    b = np.random.random((1000,400))

    with timeit():
        c1 = dot1(a,b)
    with timeit():
        c2 = dot2(a,b)

実行時間は次のとおりです。

dot1:
(0.034691810607910156, 'sec')

dot2:
(0.9215810298919678, 'sec')

ここで何が欠けているのか誰か教えてもらえますか?

4

1 に答える 1

1

あなたのアルゴリズムは単純なアルゴリズムです。BLAS はより高速なものを実装します。

ウィキペディアの行列乗算ページを引用:

それにもかかわらず、BLAS などのいくつかのライブラリに表示され、次元が n > 100 の行列に対して大幅に効率的です。

于 2014-08-28T12:28:59.290 に答える