Вопрос

i'm a user of numba, could someone tell me why the slice of numpy array is so slow, here is an example:

def pairwise_python2(X):

    n_samples = X.shape[0]

    result = np.zeros((n_samples, n_samples), dtype=X.dtype)

    for i in xrange(X.shape[0]):

        for j in xrange(X.shape[0]):

            result[i, j] = np.sqrt(np.sum((X[i, :] - X[j, :]) ** 2))

    return result

%timeit pairwise_python2(X)

1 loops, best of 3: 18.2 s per loop

from numba import double

from numba.decorators import jit, autojit

pairwise_numba = autojit(pairwise_python)

%timeit pairwise_numba(X)

1 loops, best of 3: 13.9 s per loop

it seems there is no difference between jit and cpython version, am i wrong?

Это было полезно?

Решение 2

The new version of numba has a support for a numpy array slicing and np.sqrt() function. So, this question can be closed.

Другие советы

You're timing numpy memory allocations. X[i,:] - X[j,:] generates a new matrix of shape(n_samples, n_samples), as does the square operation. Try something like the following instead:

def pairwise_python2(X):
    n_samples = X.shape[0]
    result = np.empty((n_samples, n_samples), dtype=X.dtype)
    temp = np.empty((n_samples,), dtype=X.dtype)
    for i in xrange(n_samples):
        slice = X[i,:]
        for j in xrange(n_samples):
            result[i,j] = np.sqrt(np.sum(np.power(np.subtract(slice,X[j,:],temp),2.0,temp)))
    return result

Numba doesn't add a whole lot to this because you're doing all of your operations in numpy (it will speed up the loop iterations though, which was seen in your timing function).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top