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

Python Cython-字典键和值静态类型定义,python,cython,Python,Cython,我想使用Cython编译一个Python模块,该模块使用一个字典,其中所有键都是integer类型(或者不管其他静态和已知类型是什么),所有值都是unicode类型(或者其他静态和已知类型) 现在,为了加快速度,我可以宣布 cdef dict Dict 而且 cdef int k cdef unicode v 但是,我可以对整个“dict int->unicode”结构进行静态声明吗 谢谢,我想简短的答案是否定的。Cython仍在使用内置的Python词典。如果将对象声明为dict,它可以利

我想使用Cython编译一个Python模块,该模块使用一个字典,其中所有键都是integer类型(或者不管其他静态和已知类型是什么),所有值都是unicode类型(或者其他静态和已知类型)

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

cdef dict Dict
而且

cdef int k
cdef unicode v
但是,我可以对整个“dict int->unicode”结构进行静态声明吗


谢谢,

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

您可以根据需要尝试定义一个
struct
?Python
dict
s相当不错,但如果您不小心,Cython可能会对它们非常悲观。例如,如果您将密钥类型声明为
cdef int
,并在mydict中为key编写
:value=mydict[key]
,而不是在mydict.items()中为key、value编写
,Cython将盲目地从Python
int
解包到C
int
,以存储到
key
,然后立即转身,从C
int
重新打包回Python
int
,以执行
dict
查找。它最终比原始Python代码慢(特别是如果键不在小的int缓存中),而原始Python代码不会转换为C类型并返回。我看到过与我描述的形式完全相同的真实代码,其目标是将
dict
中的值与
int
键和值相加,他们编写了
cdef int x,total=0
,mydict中x的
:total+=mydict[x]
。Cython不知道dict
s值的类型,最终生成了用Python执行加法的代码,而不是C类型,将键转换为C
int
,然后立即将它们转换回来,等等。与跳过键并完成
cdef int-total,val
,相比,代码花费的时间要长8倍左右,mydict.values()中val的
:total+=val
;次优Cython可能很糟糕。@ShadowRanger,关于
np.fromiter(mydict.values()).sum()
?这是一个更好的解决方案,将在C中完成吗?(挑剔你,因为你似乎对此有所了解…*
itervalues()
ifpy2@Ori5678:实际上,更好的解决方案是求和(mydict.values())(
itervalues
表示Py2);CPython内置的
sum
已经过优化,可以用C级速度对
int
s的一个整数进行求和(如果求和超过C
long
的大小,它会变慢,但仍然是正确的,
numpy
会出错),因此,当你可以转换并立即求和时,转换成C级整数数组仅仅求和实际上并没有什么好处。如果你很小心的话,你可以和Cython的速度相媲美,但不能有意义的提高。