gpt4 book ai didi

python - 由于使用对象类型声明,此扩展类型的效率可能会低到什么程度?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:14 25 4
gpt4 key购买 nike

我被告知以下扩展类型 may not be very efficient由于使用 DefaultDict 需要 Python 对象类型声明。有人可以解释为什么会这样,以及 DefaultDict 是否仍然值得使用(而不是 dict)?

cdef class CythonClass(object):

cdef int var1, var2
cdef object defaultdict

def __init__(self, a, b):
self.var1 = a
self.var2 = b
self.defaultdict = DefaultDict(DefaultDict([]))

最佳答案

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

您可以使用它们,并且不会比在 python 代码中使用它们慢(极少数情况除外)。然而,Cython 的强大之处在于,您可以利用 native c 类型和同类数据结构,例如 c 数组(它比 python 列表甚至字典快得多),或者如果您使用 c++,则还可以使用向量。 、unordered_map 等。

处理 Python 对象时要记住的一点是,所有 python 对象都是指向某些结构的指针,因此每个对象都会添加一层间接层 - 对于 Python int 来说也是如此。s.然而,Cython int 是一个没有这种间接寻址的 C 整数。这是 Cython 中的 for 循环速度更快的主要原因之一。 (但是它们仅限于 64 位范围,而不是像 Python 那样无限精度,这就是权衡)。

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

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 的那个(__Pyx_PyDict_GetItem 可能是 PyDict_GetItemPyDict_GetItemString 的复杂包装器)或仅寻址 python 的那个使用 PyObject_GetItem 对象(通过 python 查找)。这也不会带来巨大的加速,但它是值得注意的。

最后我想说,在 Cython 代码中,正常(和声明的)dict 肯定比 DefaultDict (除了一些 C 或 C++ 类)更快。

关于python - 由于使用对象类型声明,此扩展类型的效率可能会低到什么程度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com