Python 模块 Counter() 是否使用 C?
Is the Python Module Counter() Using C?
当我使用函数时:
from collections import Counter
Counter() 的来源是使用 C 结构吗?有什么方便的方法可以确定这个和其他功能的一般性吗?
鉴于 Python 通常是开源的,如果这是确定给定函数是否使用 C 结构的最佳方法,我应该在源代码中寻找什么?
对于 classes 没有直接的断言方法,但是有一种方法可以确定函数或方法是否是用 C 编写的。因此任何用 C 编写的 class 可能至少定义了C 中的一个显式或隐式函数(如果不是它会很困难),你可以检查 inspect.isbuiltin
:
>>> import collections
>>> import inspect
>>> def is_c_class(cls):
... return any(inspect.isbuiltin(getattr(cls, methname, None))
... for methname in cls.__dict__)
>>> is_c_class(collections.Counter)
False
>>> is_c_class(dict)
True
然而,这还不是全部,因为 collections.Counter
调用了 collections._count_elements
,这是一个 C 函数:
>>> inspect.isbuiltin(collections._count_elements)
True
所以你应该经常检查源代码(Pythons repository is on github and also the implementation for Counter
)以确保。
请注意,上述使用 isbuiltin
进行的检查存在一些缺陷。例如,您可以有一个 class 属性,它是一个 C 函数:
>>> class Test(object):
... c_function = all # builtin all function is a C function
>>> is_c_class(Test)
True
所以不要依赖它总是给出正确的结果,将其视为近似值。
当我使用函数时:
from collections import Counter
Counter() 的来源是使用 C 结构吗?有什么方便的方法可以确定这个和其他功能的一般性吗?
鉴于 Python 通常是开源的,如果这是确定给定函数是否使用 C 结构的最佳方法,我应该在源代码中寻找什么?
对于 classes 没有直接的断言方法,但是有一种方法可以确定函数或方法是否是用 C 编写的。因此任何用 C 编写的 class 可能至少定义了C 中的一个显式或隐式函数(如果不是它会很困难),你可以检查 inspect.isbuiltin
:
>>> import collections
>>> import inspect
>>> def is_c_class(cls):
... return any(inspect.isbuiltin(getattr(cls, methname, None))
... for methname in cls.__dict__)
>>> is_c_class(collections.Counter)
False
>>> is_c_class(dict)
True
然而,这还不是全部,因为 collections.Counter
调用了 collections._count_elements
,这是一个 C 函数:
>>> inspect.isbuiltin(collections._count_elements)
True
所以你应该经常检查源代码(Pythons repository is on github and also the implementation for Counter
)以确保。
请注意,上述使用 isbuiltin
进行的检查存在一些缺陷。例如,您可以有一个 class 属性,它是一个 C 函数:
>>> class Test(object):
... c_function = all # builtin all function is a C function
>>> is_c_class(Test)
True
所以不要依赖它总是给出正确的结果,将其视为近似值。