myślę, że nie można zrobić inaczej, ale przekształcić go samemu:
cimport cython
from libc.stdlib cimport malloc, free
...
cdef double *anorms
cdef unsigned int i;
anorms = <double *>malloc(len(anorms2)*cython.sizeof(double))
if anorms is NULL:
raise MemoryError()
for i in xrange(len(anorms2)):
anorms[i] = anorms2[i]
return contr_hrr(len(acoefs),a.origin[0],a.origin[1],a.origin[2],anorms)
Gdybyś był w C++, to byłaby inna, ponieważ
The following coercions are available:
Python type => C++ type => Python type
bytes std::string bytes
iterable std::vector list
iterable std::list list
iterable std::set set
iterable (len 2) std::pair tuple (len 2)
Jeśli można przełączyć się C++, czy masz bezpośrednie tłumaczenie z List[float]
do vector<double>
:
from libcpp.vector cimport vector
def py_contr_hrr(vector[double] anorms2, ...):
...
return contr_hrr(len(acoefs),a.origin[0],a.origin[1],a.origin[2],anorms2)
i wywołanie bezpośrednio ze strony Pythona:
anorms2 = [12.0, 0.5, ...]
py_contr_hrr(anorms2, ....)
Źródło: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library
Ale ja nie wiem, czy to jest opcja, że można rozważyć ... To zależy od ograniczeń Twojego projektu, oczywiście .
EDYCJA: Nie wiedziałem o sposobie wykonania Nikita
(który jest elegancki, nawiasem mówiąc), i nie znam eteru, który jest najlepszy w odniesieniu do występów na dużych tablicach.
Jeśli masz okazję przetestować różne metody, byłbym bardzo zainteresowany wiedząc, który jest najszybszy ... –
@Golgauth - Na pewno spróbuję. Kod jest 2 razy wolniejszy niż stara metoda, w której bezpośrednio owinąłam procedury C używając C. – Rick
Jakie było twoje ostatnie podejście? Być może możesz napisać własną odpowiedź na ten temat ... –