Cython:有效地循环具有多种类型的列表

Cython: Efficiently loop over list with multiple types

我有一个 Python 循环遍历列表的函数,我想将它转换为 Cython 以提高性能。

它接受的列表包含字符串、整数和浮点数的混合,所以我不确定如何静态键入所涉及的变量(我不懂 C)。

在 Cython 中实现类似功能的最有效方法是什么?

您似乎希望 C 类型具有 Python 对象的所有灵活性,但不知何故神奇地更快。

基本上这里有一个好选项和一个坏选项:

  • 最好的选择是接受这种类型实际上并不存在。

    因此,您应该保留从列表中提取的未类型化数据,以便它仍然是一个常规 Python 对象。并非 Cython 中的所有内容都需要键入 - 绝大多数 Python 代码应该 运行 不变。

    可能值得将您的列表键入 list,因为当 Cython 知道可迭代对象是一个列表时,它可以生成稍微更有效的循环。

  • 错误的选择是使用 C 的一个特性,称为 union,它表示一个变量,该变量是有限数量的不同类型之一。我不推荐这个(特别是对于那些还不知道 C 的人),因为没有“简单”的 Cython 包装(你必须直接深入了解 C 的细节)。您会发现在 union 中处理字符串特别具有挑战性。

    选择此选项需要您自担风险。