如果我将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列表更可取吗?
在赛顿,你没有义务申报任何东西。声明类型通常有助于提高性能。通常是因为如果您声明类型,但随后不使用它们,则可能会导致类型检查并打包解包。唯一确定的方法就是测量。
要声明列表的类型,只需放在开头
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数组在内存上更轻。相关问题 更多 >
编程相关推荐