Python 3.x 为什么heapq.heapify这么快?

Python 3.x 为什么heapq.heapify这么快?,python-3.x,heapq,Python 3.x,Heapq,我尝试重新实现heapify方法,以便使用\u siftup和\u siftdown更新或删除堆中的任何节点,并保持O(log(n))的时间复杂度 我做了一些努力来优化我的代码,但与heapq.heapify(就所花费的总时间而言)相比,它们被证明是更糟糕的。所以我决定调查一下。并将复制的代码与模块代码进行了比较 #堆不变量。 def\U siftdown(堆、启动、位置): newitem=heap[pos] #沿着根的路径,向下移动父对象,直到找到一个位置 #新项目适合。 当pos>star

我尝试重新实现heapify方法,以便使用
\u siftup
\u siftdown
更新或删除堆中的任何节点,并保持O(log(n))的时间复杂度

我做了一些努力来优化我的代码,但与
heapq.heapify
(就所花费的总时间而言)相比,它们被证明是更糟糕的。所以我决定调查一下。并将复制的代码与模块代码进行了比较

#堆不变量。
def\U siftdown(堆、启动、位置):
newitem=heap[pos]
#沿着根的路径,向下移动父对象,直到找到一个位置
#新项目适合。
当pos>startpos时:
parentpos=(pos-1)>>1
父=堆[parentpos]
如果newitem<父项:
堆[pos]=父
pos=parentpos
持续
打破
堆[pos]=newitem
def_siftup(堆,位置):
endpos=len(堆)
startpos=pos
newitem=heap[pos]
#把较小的孩子泡起来,直到碰到叶子为止。
childpos=2*pos+1#最左边的子位置
而childpos
我发现总是
cp3-cp2
=
cp2-cp1
不一样,
heapify
花费的时间比
heapq.heapify
多,即使两者都一样。
在某些情况下,
heapify
需要3秒,
heapq.heapify
需要0.1秒

heapq.heapfy模块的执行速度比同一个heapify模块快,因为它们仅通过导入而有所不同


请告诉我原因,如果我犯了一些愚蠢的错误,我很抱歉。

来自
heapq
模块的
heapify
实际上是一个内置函数:

>>> import heapq
>>> heapq
<module 'heapq' from 'python3.9/heapq.py'>
>>> heapq.heapify
<built-in function heapify>

这将用它们的C实现覆盖像
heapify
这样的函数。例如,
\u heapq.heapify
是。

添加到这一点上,因为我很惊讶。如果可能的话,就是用C覆盖Python定义的地方。@aryamcarthy,是的,我也找到了!
# If available, use C implementation
try:
    from _heapq import *
except ImportError:
    pass