Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否应在cython中定义列表项类型?_Python_List_Cython - Fatal编程技术网

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函数发送一个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 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
(请参阅)。最好的选择显然取决于上下文。