2015-05-04 4 views
2

Я пишу простую функцию в cython с использованием numpy, но кажется, что cython производит тонну API при преобразовании в C++. Может ли кто-нибудь помочь мне с ошибкой? Я больше ничего не нашел в документах cython.Numpy in Cython, без улучшения

operations.pyx:

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

@cython.boundscheck(False) 
@cython.wraparound(False) 
@cython.nonecheck(False) 
def diff(np.ndarray[np.float64_t, ndim=2] a, 
     np.ndarray[np.float64_t, ndim=2] b): 
    cdef int cols = 100 
    cdef int rows = 100 
    for _ in range(1000): 
     for i in range(rows): 
      b[i, 0] = (a[i, 1] - a[i, cols - 1])/2 
     for i in range(1, cols - 1): 
      b[:, i] = (a[:, i + 1] - a[:, i - 1])/2 
     for i in range(rows): 
      b[i, cols - 1] = (a[i, 0] - a[i, cols - 2])/2 
    return 

я почти с той же скоростью в python и cython. Если я изменил выбор столбца (:), он станет намного хуже (на 5 раз медленнее). может ли кто-нибудь показать мне, где может быть ошибка?

HTML вывода из cython аннотации:

enter image description here

+0

, пожалуйста, будьте конкретны, удалите уродливую фигуру и на самом деле введите/вставьте код, отформатируйте его и т. Д. Вы были достаточно долго, чтобы знать эти вещи. -1. – gg349

+0

@ gg349, изображение представляет собой выход html cython. Код был добавлен в любом случае. – rowman

+0

уточните пожалуйста – gg349

ответ

2

Петли использовать i и j_) как объекты Python, попытайтесь cdef -ную их; например, здесь:

cdef int cols = 100 
cdef int rows = 100 
cdef int i = 0 
cdef int j = 0 

Поскольку вы не делаете операции над _, я думаю, что Cython обрабатывает это правильно, и не нужна быть CD, но вы можете попробовать (во всяком случае, это просто линия).

+0

Спасибо, '_' не было важно. Улучшение скорости в 30 раз происходит после 'cdef'ing' i' и 'j'. – rowman

+0

':' также должны быть удалены, конечно, для максимальной скорости. – rowman