Python Cython-字典键和值静态类型定义
我想使用Cython编译一个Python模块,该模块使用一个字典,其中所有键都是integer类型(或者不管其他静态和已知类型是什么),所有值都是unicode类型(或者其他静态和已知类型) 现在,为了加快速度,我可以宣布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,它可以利
cdef dict Dict
而且
cdef int k
cdef unicode v
但是,我可以对整个“dict int->unicode”结构进行静态声明吗
谢谢,我想简短的答案是否定的。Cython仍在使用内置的Python词典。如果将对象声明为dict,它可以利用一些优化,但最终dict必须能够存储不同类型的对象,因此不能在编译时指定键或值类型。但是您应该首先检查以确保这是一个瓶颈Python字典相当不错。您可以根据需要尝试定义一个
struct
?Pythondict
s相当不错,但如果您不小心,Cython可能会对它们非常悲观。例如,如果您将密钥类型声明为cdef int
,并在mydict中为key编写:value=mydict[key]
,而不是在mydict.items()中为key、value编写,Cython将盲目地从Pythonint
解包到Cint
,以存储到key
,然后立即转身,从Cint
重新打包回Pythonint
,以执行dict
查找。它最终比原始Python代码慢(特别是如果键不在小的int缓存中),而原始Python代码不会转换为C类型并返回。我看到过与我描述的形式完全相同的真实代码,其目标是将dict
中的值与int
键和值相加,他们编写了cdef int x,total=0
,mydict中x的:total+=mydict[x]
。Cython不知道dict
s值的类型,最终生成了用Python执行加法的代码,而不是C类型,将键转换为Cint
,然后立即将它们转换回来,等等。与跳过键并完成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的一个整数进行求和(如果求和超过Clong
的大小,它会变慢,但仍然是正确的,numpy
会出错),因此,当你可以转换并立即求和时,转换成C级整数数组仅仅求和实际上并没有什么好处。如果你很小心的话,你可以和Cython的速度相媲美,但不能有意义的提高。