【问题标题】:Should list item type be defined in cython?是否应该在 cython 中定义列表项类型?
【发布时间】:2014-07-05 11:53:28
【问题描述】:

如果我将 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 列表是否更可取?

【问题讨论】:

    标签: python list cython


    【解决方案1】:

    在 Cython 中,您没有义务声明任何内容。声明类型通常有助于提高性能。 通常是因为如果你声明了类型,但又不使用它们,你可能会引发类型检查和打包解包。唯一确定的方法是测量。

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

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

    公平地说,您必须考虑数据的生存方式。如果您将所有内容都放在列表中,您的数组函数可能会更快,但list -> array -> f_array -> array -> list 可能比list -> f_list -> list 慢。如果您不在乎,根据经验,当长度为常数时使用数组,否则使用列表。另请注意,对于大量数据,numpy 数组占用的内存较轻。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2022-01-23
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多