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

2024-04-25 12:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我将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

从定义列表项类型中获得了什么速度?传递numpy数组而不是python列表更可取吗?


Tags: ofin类型列表forexampletypepass
1条回答
网友
1楼 · 发布于 2024-04-25 12:00:50

在赛顿,你没有义务申报任何东西。声明类型通常有助于提高性能。通常是因为如果您声明类型,但随后不使用它们,则可能会导致类型检查并打包解包。唯一确定的方法就是测量。

要声明列表的类型,只需放在开头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数组在内存上更轻。

相关问题 更多 >