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
中处理字符串特别具有挑战性。
选择此选项需要您自担风险。
我有一个 Python 循环遍历列表的函数,我想将它转换为 Cython 以提高性能。
它接受的列表包含字符串、整数和浮点数的混合,所以我不确定如何静态键入所涉及的变量(我不懂 C)。
在 Cython 中实现类似功能的最有效方法是什么?
您似乎希望 C 类型具有 Python 对象的所有灵活性,但不知何故神奇地更快。
基本上这里有一个好选项和一个坏选项:
最好的选择是接受这种类型实际上并不存在。
因此,您应该保留从列表中提取的未类型化数据,以便它仍然是一个常规 Python 对象。并非 Cython 中的所有内容都需要键入 - 绝大多数 Python 代码应该 运行 不变。
可能值得将您的列表键入
list
,因为当 Cython 知道可迭代对象是一个列表时,它可以生成稍微更有效的循环。错误的选择是使用 C 的一个特性,称为
union
,它表示一个变量,该变量是有限数量的不同类型之一。我不推荐这个(特别是对于那些还不知道 C 的人),因为没有“简单”的 Cython 包装(你必须直接深入了解 C 的细节)。您会发现在union
中处理字符串特别具有挑战性。选择此选项需要您自担风险。