Python 是否应在cython中定义列表项类型?
如果我向cython函数发送一个python列表进行迭代,我是否应该声明列表项的类型?在cython中循环列表的最佳方式是什么?例如:Python 是否应在cython中定义列表项类型?,python,list,cython,Python,List,Cython,如果我向cython函数发送一个python列表进行迭代,我是否应该声明列表项的类型?在cython中循环列表的最佳方式是什么?例如: #Cython function, passed a list of float items def cython_f(list example_list): cdef int i for i in range(len(example_list)): #Do stuff #but list item type no
#Cython function, passed a list of float items
def cython_f(list example_list):
cdef int i
for i in range(len(example_list)):
#Do stuff
#but list item type not defined?
pass
#Alternative loop
cdef j float #declaration of list item type
for j in example_list:
#Do stuff
pass
尝试定义列表项类型是否能提高速度?传递numpy数组而不是python列表更可取吗?在Cython中,您无需声明任何内容。声明类型通常有助于提高性能。这通常是因为如果您声明了类型,但不使用它们,则可能会导致类型检查和打包解包。唯一确定的方法是测量 要声明列表的类型,只需将cdef float value置于开头,并置于循环中
value=example\u list[i]
您应该使用列表还是numpy数组?数组是一个统一的数据容器。这意味着您可以将其声明为float32\t
,Cython将知道如何以C速度使用它(访问速度更快,因为它保证在内存中是连续的和跨步的)。另一方面,如果要更改大小,可能最好使用列表(或者对于非常频繁的使用,可能是libcpp.vector
)。所以答案是它取决于你做什么,但在大多数情况下,数组更好
公平地说,你必须考虑数据是如何生活的。如果列表中包含所有内容,那么使用数组的函数可能会更快,但是
list->array->f_array->array->list
可能会比list->f_list->list
慢。如果你不在乎,根据经验,当长度不变时使用数组,否则使用列表。还要注意的是,对于大量数据,numpy数组的内存更轻。值得注意的是,除了libcpp.vector
,还有几种更好、更集成的替代方法,即cpython.array
(请参阅)。最好的选择显然取决于上下文。