add cython implementation