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

所以不要依赖它总是给出正确的结果,将其视为近似值。