2016-06-22 10 views
0

私はCythonを学び、ブートストラップ機能のスピーディーなバージョンを書こうとしています。私のメインループにはまだ黄色い厄介な声明が1つあり、なぜそれが黄色であるのかわかりません。私は本当に助けに感謝します、ありがとう。Cython - ループ内のインデックス割り当てステートメントがまだ黄色ですか?

import numpy as np 
cimport numpy as np 
from libc.stdlib cimport rand, RAND_MAX 


ctypedef np.float64_t FLOAT_t 

cpdef FLOAT_t cython_avg(np.ndarray[FLOAT_t, ndim=1] A): 
    cdef double [:] x = A 
    cdef double s = 0 
    cdef unsigned int N = A.shape[0] 
    for i in xrange(N): 
     s += x[i] 
    return s/N 


def confidence_interval_mean(np.ndarray[FLOAT_t, ndim=1] sample,int its,int p): 
    cdef int n = len(sample) 
    cdef double[:] means = np.zeros(its,dtype=np.float) 
    cdef np.ndarray[FLOAT_t, ndim=1] s = np.zeros(n,dtype=np.float) 
    for i in xrange(its): 
     for j in xrange(n): 
      s[j] = sample[<int>(rand()/RAND_MAX * n)] 
     means[i] = cython_avg(s) 
    return np.percentile(means,[(100-p)/2,(100+p)/2]) 

2つのforループの内側にある線:

The line which is inside the two <code>for</code> loops

答えて

0

Cythonは依然としてゼロ除算をチェックコード生成:

if (unlikely(RAND_MAX == 0)) { 
    PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); 
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
} 

インデックス境界ため(図BufferIndexErrorを起きている)。このコードでは、適切なPythonの例外を発生させる必要があります。そうした場合、Pythonのやりとりがあります。この相互作用からのオーバーヘッドは、あなたが本当に気にするべきものではありません。

あなたはそれが完全に白い取得したいとあなたは常に分母!= 0一定であり、ループが範囲外の要素にアクセスしようとしたことがないということならば、あなたはこれらを排除するためにappropriate compiler directivesboundscheckcdivision)を追加することができた場合。

cimportそれら:

from cython cimport cdivision, boundscheck 

と(他の方法の中で)あなたの関数confidence_interval_mean飾る:

@cdivision 
@boundscheck(False) 
def confidence_interval_mean(np.ndarray[FLOAT_t, ndim=1] sample,int its,int p): 
    # body stays the same 

を今、あなたは何のチェックと白のラインを取得していない:

enter image description here

関連する問題