Cython - 字典键和值静态类型定义

Ori*_*678 6 python cython

我想使用Cython来编译一个Python模块,该模块使用一个字典,其中所有键都是类型,比如整数(或者无论其他静态和已知类型),以及unicode类型的所有值(或其他静态和已知的) ).

现在,为了加快速度,我可以宣布

cdef dict Dict
Run Code Online (Sandbox Code Playgroud)

并且

cdef int k
cdef unicode v
Run Code Online (Sandbox Code Playgroud)

但是,我可以对整个"dict int-> unicode"结构进行静态声明吗?

谢谢,

小智 7

我认为简短的回答是否定的.Cython仍在使用内置的Python字典.如果将对象声明为dict,它可以利用一些优化,但最终dict必须能够存储不同类型的对象,因此您无法在编译时指定类型.但是你应该先检查一下,确保这是一个瓶颈.Python词典相当不错.

  • Python `dict`s 相当不错,但如果你不小心,Cython 可能会让它们非常悲观。例如,如果你声明你的key类型为`cdef int`,并且在mydict中写成`for key: value = mydict[key]`,而不是`for key, value in mydict.items():`,Cython会盲目从 Python `int` 解包到 C `int` 以存储到 `key`,然后立即转身并从 C `int` 重新打包回 Python `int` 以执行 `dict` 查找。它最终比原始 Python 代码慢(特别是如果键不在小型 int 缓存中),后者不会转换为 C 类型并返回。 (2认同)