При использовании keyfunc в heapq.nlargest
наблюдается резкое heapq.nlargest
:
>>> from random import random
>>> from heapq import nlargest
>>> data = [random() for _ in range(1234567)]
>>> %timeit nlargest(10, data)
30.2 ms ± 1.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit nlargest(10, data, key=lambda n: n)
159 ms ± 6.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я ожидал небольшой дополнительной стоимости, возможно, примерно 30% - не 400%. Эта деградация, по-видимому, воспроизводима по нескольким различным размерам данных. Вы можете видеть, что в исходном коде есть обработка специального случая, if key is None
, но в противном случае реализация выглядит более или менее одинаковой.
Почему производительность снижается с помощью ключевой функции? Это связано только с дополнительными служебными функциями функции или алгоритмом, который в корне изменился каким-то образом с помощью keyfunc?
Для сравнения, sorted
занимает около 30% попадания с теми же данными и лямбдой.