3

私はcythonを学ぼうとしています; しかし、私は何か間違ったことをしているに違いありません。この小さなテスト コードは、ベクトル化された numpy バ​​ージョンよりも約 50 倍遅く実行されます。cython が python よりも遅い理由を教えてください。ありがとう。

このコードは、R^3, loc 内のポイントと、R^3, ポイント内のポイントの配列の間の距離を計算します。

import numpy as np
cimport numpy as np
import cython
cimport cython

DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
@cython.boundscheck(False) # turn of bounds-checking for entire function
@cython.wraparound(False)
@cython.nonecheck(False)
def distMeasureCython(np.ndarray[DTYPE_t, ndim=2] points, np.ndarray[DTYPE_t, ndim=1] loc):
    cdef unsigned int i
    cdef unsigned int L = points.shape[0]
    cdef np.ndarray[DTYPE_t, ndim=1] d = np.zeros(L)
    for i in xrange(0,L):
        d[i] = np.sqrt((points[i,0] - loc[0])**2 + (points[i,1] - loc[1])**2 + (points[i,2]  - loc[2])**2)
    return d

これは、比較対象の numpy コードです。

from numpy import *
N = 1e6
points = random.uniform(0,1,(N,3))
loc = random.uniform(0,1,(3))

def distMeasureNumpy(points,loc):
    d = points - loc
    d = sqrt(sum(d*d,axis=1))
    return d

numpy/python バージョンは約 44ms、cython バージョンは約 2 秒かかります。Mac osxでpython 2.7を実行しています。ipython の %timeit コマンドを使用して、2 つの関数の時間を計っています。

4

2 に答える 2