這是一個非常不完整的答案,只有真正覆蓋一對夫婦的它一小部分(如果我想的更多的東西,我會編輯):
升壓doesn't look to implement operator[]
specifically for numpy arrays。這意味着operator[]
將來自基類object
類(即ndarray
繼承),這將意味着調用將通過Python機制到達__getitem__
,因此索引將變慢(接近Python速度)。如果你想在速度做索引,你必須自己做指針運算:
// rough gist - untested:
// i,j,k are your indices
double* data = reinterpret_cast<double*>(array.get_data());
// in reality you'd check the dtype - the data may not be a double...
double data_element = array.strides(0)*i + array.strides(1)*j +array.strides(2)*k;
相比之下用Cython有內置的自動numpy的陣列的高效的索引。
用Cython是不一樣的東西大std::vector
(雖然不是絕對可怕的 - 你可以它通常誘使做你想要什麼)。一個明顯的限制是所有的cdef
都必須在函數的開頭,所以C++類在默認情況下在那裏構造,然後在之後分配給/操作(這可能有點低效)。對於超出簡單用途的任何事情,您不希望在Cython中操作C++類型(相反,最好使用C++編寫代碼,然後從Cython調用它)。
第二個限制是它與非類模板發生衝突。一個常見的例子是std::array
,它以模板編號。根據您計劃的代碼,這可能會也可能不是問題。
如果你想要更多的答案,然後不接受我的!當它顯然只是部分答案時,接受它會說「這個問題已經解決了」。 – DavidW
考慮到問題的性質,我無法知道它是否是部分的。道歉,如果這是不好的禮儀。 – MaxB
這不是真正的禮節(你可以選擇接受任何你喜歡的問題) - 我只是覺得你有最好的機會在沒有被接受的答案的情況下得到更多的答案。 – DavidW