Python 由于使用对象类型声明,此扩展类型在多大程度上可能效率低下?

Python 由于使用对象类型声明,此扩展类型在多大程度上可能效率低下?,python,cython,Python,Cython,由于使用DefaultDict需要Python对象类型声明,我被告知以下扩展类型。有人能解释为什么会这样,以及DefaultDict是否仍然值得使用(与dict相反) 我可能夸大了其中的效率部分。我的意思是:当您必须使用Python对象时,不要期望巨大的加速(超过1.5-2倍) 您可以使用它们,并且不会比在python代码中使用它们慢(非常罕见的情况除外)。然而,Cython的强大之处在于,你可以利用原生C类型和同构的数据结构,比如C数组(它可以比Python列表甚至字典更快得多),或者如果你走

由于使用
DefaultDict
需要Python对象类型声明,我被告知以下扩展类型。有人能解释为什么会这样,以及
DefaultDict
是否仍然值得使用(与
dict
相反)


我可能夸大了其中的效率部分。我的意思是:当您必须使用Python对象时,不要期望巨大的加速(超过1.5-2倍)

您可以使用它们,并且不会比在python代码中使用它们慢(非常罕见的情况除外)。然而,Cython的强大之处在于,你可以利用原生C类型和同构的数据结构,比如C数组(它可以比Python列表甚至字典更快得多),或者如果你走C++,也可以是代码>矢量< /代码>,<代码>无序的映射> /COD>等等。 在处理Python对象时要记住的一点是,所有的Python对象都是指向某些结构的指针,因此每一个对象都添加了一层间接寻址——甚至对于Python
int
s也是如此。然而,Cython
int
是一个没有间接寻址的C-整数。这就是为什么Cython中的
for
-循环要快得多的主要原因之一。(然而,它们被限制在64位的范围内,而不是像Python那样的无限精度,这是一种折衷)

另一点是,在python对象上操作意味着您需要进行python查找、python操作等。然而,对于内置的对象,cython可以通过避免基于python的查找来获得额外的速度(
DefaultDict
我想不在其中),例如,对于声明的DICT,以下代码的编译方式不同:

def dumb_func(dict dct, str key):
    return dct[key]   # translates to: __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_v_key)


def dumb_func(object dct, object key):  # different signature
    return dct[key]   # translates to: PyObject_GetItem(__pyx_v_dct, __pyx_v_key)
您可能会猜到哪一个更快,直接处理dict的那个(可能是and的复杂包装器),还是只处理带有
PyObject\u GetItem
的python对象的那个(通过python查找)。这也不会是一个巨大的加速,但这是显而易见的

最后,我认为Cython代码<代码> DICT< /Clult> s在Cython代码中肯定比 Debug((除了C或C++类)要快。

def dumb_func(dict dct, str key):
    return dct[key]   # translates to: __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_v_key)


def dumb_func(object dct, object key):  # different signature
    return dct[key]   # translates to: PyObject_GetItem(__pyx_v_dct, __pyx_v_key)