我认为你不能这样做,而是自己转换它:
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)
如果你使用过 C++,情况会有所不同,因为
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)
如果您可以切换到 C++,您将可以直接转换List[float]
为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)
并直接从 Python 端调用:
anorms2 = [12.0, 0.5, ...]
py_contr_hrr(anorms2, ....)
来源:http ://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library
但我不知道这是否是您可以考虑的选择...当然,这取决于您项目的限制。
编辑:我不知道Nikita
' 的做事方式(顺便说一句,这是一种优雅的方式),而且我不知道哪种方式最适合大型阵列的表演。