Python heapq - Python和C实现?哪一个被使用了?

8

我正在浏览Python源代码,注意到了一个C实现heapq,以及一个Python实现。为什么两者都存在?当我从CPython中导入import heapq时使用哪一个?

1个回答

6

import heapq 导入了Python的实现。您可以通过检查交互式解释器中 heapq 的值来确认:

In [20]: import heapq

In [21]: heapq
Out[21]: <module 'heapq' from '/usr/lib/python2.7/heapq.pyc'>

heapq.pycheapq.py模块的字节编译版本。

然而,在heapq.py文件内部,有以下内容:(请参考链接)

# If available, use C implementation
try:
    from _heapq import *
except ImportError:
    pass

_heapqmodule.c提供了_heapq模块。因此,如果C实现可用,则import heapq将使用C实现。


请注意,这是许多对性能敏感的Python库中都普遍使用的模式。 - Russell Borogove
我明白了。编译后的库在什么情况下会不可用? - Gareth
@Gareth:虽然CPython是Python最常用的实现,但还有其他实现方式,比如Jython、IronPython和PyPy。一些实现方式(尤其是基于Java的Jython)可能以Python实现为基础,但不使用C实现。 - unutbu
除了支持不带C支持的基于VM的Python实现外,https://mail.python.org/pipermail/python-dev/2008-October/083078.html 还提到另一个你会看到双重Python/C实现的原因:Python版本首先出现,由于速度而被C版本取代,但为了文档、回归测试和可分叉性而保留。 - Russell Borogove
你怎么知道哪个实际上被使用了呢?导入后调用heapq会告诉你不同的东西吗? - channon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接