import heapq


def top_k(values, k):
    if k < 0:
        raise ValueError('k must be non-negative')
    if k == 0:
        return []
    heap = []
    for value in values:
        if len(heap) < k:
            heapq.heappush(heap, value)
        elif value > heap[0]:
            heapq.heapreplace(heap, value)
    return sorted(heap, reverse=True)


if __name__ == '__main__':
    print(top_k(iter([4, 1, 8, 8, 2]), 3))
