local function heapfy_up(heap) local i = heap.size local p = math.floor(i/2) local t while i>1 and heap.data[i]<heap.data[p] do t = heap.data[i] heap.data[i] = heap.data[p] heap.data[p] = t i = p p = math.floor(i/2) end end local function push_heap(heap,e) heap.data[heap.size+1] = e heap.size = heap.size+1 heapfy_up(heap) end local function print_heap(heap) print(table.concat(heap.data,"/n"),"size:",heap.size,#heap.data) end local function heapfy_down(heap,i) local l = 2*i local r = 2*i + 1 local i_min = i local t if i>=heap.size then return end --print_heap(heap) --print('~~~') --print(i,heap.data[i]) --print(l,heap.data[l]) if l<=heap.size then if heap.data[i]<heap.data[l] then i_min = i else i_min = l end end if r<=heap.size then if heap.data[r]<heap.data[i_min] then i_min = r end end if i_min~=i then t = heap.data[i] heap.data[i] = heap.data[i_min] heap.data[i_min] = t heapfy_down(heap,i_min) end end local function pop_heap(heap) heap.data[1]=heap.data[heap.size] heap.size = heap.size-1 heapfy_down(heap,1) end local f = io.open("data.txt") local heap = {data={},size=0} local N = 100 for i=1,10000000 do local num = tonumber(f:read("*l")) if heap.size<N then push_heap(heap,num) else --print_heap(heap) --os.exit(0) if num> heap.data[1] then pop_heap(heap) push_heap(heap,num) end end end print_heap(heap) 采用luajit运行,比基于heapq的python程序快了一倍