是否应该在cython中定义列表项类型?

kez*_*zos 10 python list cython

如果我将一个python列表发送到cython函数进行迭代,我想要声明列表项是什么类型的?在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
Run Code Online (Sandbox Code Playgroud)

尝试定义列表项类型是否获得了任何速度?是否最好传递numpy数组而不是python列表?

Dav*_*dmh 18

在Cython中,您没有义务申报任何内容.声明类型通常有助于提高性能.在通常是因为如果你声明的类型,但后来不使用它们,你可能会诱发类型检验,包装,拆包.唯一可以确定的方法是衡量.

要声明列表的类型,只需放在开头cdef float value和循环中value = example_list[i].

你应该使用list还是numpy数组?数组是统一的数据容器.这意味着您可以将其声明为float32_t,并且Cython将知道如何以C速度使用它(访问速度更快,因为它保证在内存中连续和跨越).另一方面,如果您要更改大小,则可能更好地使用列表(或者可能用于非常繁重的使用libcpp.vector).所以答案取决于你做了什么,但在大多数情况下,阵列更好.

公平地说,你必须考虑数据是如何生活的.如果列表中包含所有内容,则使用数组的函数可能会更快,但速度list -> array -> f_array -> array -> list可能会慢于list -> f_list -> list.如果您不在乎,根据经验,当长度恒定时使用数组,否则列出.另请注意,对于大量数据,numpy数组在内存上更轻.

  • 值得注意的是,`libcpp.vector`有几个更好,更集成的替代品,即`cpython.array`(参见http://stackoverflow.com/questions/18462785/what-is-the-recommended-way-的-分配存储器换一类型的存储器视图).最好的选择显然取决于背景. (5认同)