Это, кажется, основано на моем ответе на другой вопрос .Цель добавления __getitem__
и __setitem__
к cdef class Vector
заключается в том, чтобы его можно было индексировать из Python.Из Cython вы можете индексировать в вектор C ++ напрямую для дополнительной скорости.
В начале вашего files_to_bins
добавьте строку:
cdef Vector v
Это заставит Cython убедиться, что что-нибудьv
назначен объект Vector
(в противном случае он вызовет TypeError
, и, следовательно, вам будет разрешен прямой доступ к его атрибутам cdef
.
Затем измените строку:
v[i] = v[i] + half_fragment_size
до:
v.wrapped_vector[i] = v.wrapped_vector[i] + half_fragment_size
(и аналогично для других строк индексации)
Имейте в виду, что boundscheck(False)
и wraparound(False)
делает абсолютно ничего для объектов C ++.Оператор индексации C ++ не выполняет проверку границ (и Cython не добавляет его), а также не поддерживает отрицательную индексацию.boundscheck
и wraparound
применяются только для индексирования представлений памяти или массивов.