Время группировки операций выше, чем сумма времени с Python timeit
Я работаю в ноутбуке Jupyter с ядром Python3.6.
Я начну со следующих определений:
upstream = 10
downstream = 15
ref_pos = 20
positions = range(50)
def in_range(position):
return ref_pos - upstream <= position <= ref_pos + downstream
Я экспериментирую с различными способами получения элементов из positions
которые находятся в (включающем в конец) диапазоне [ref_pos - upstream
, ref_pos + downstream
], и следующее выглядело многообещающе:
from itertools import groupby
from operator import itemgetter
(_, group) = next(filter(itemgetter(0), groupby(positions, in_range)))
real_positions = list(group)
Действительно, мои другие подходы "одной операции" до сих пор были рассчитаны не менее чем на 6,5 мкс 1, тогда как сроки вышеупомянутого дали отдельно:
%timeit (_, group) = next(filter(itemgetter(0), groupby(positions, in_range)))
Результат:
3.11 µs ± 254 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
А также:
(_, group) = next(filter(itemgetter(0), groupby(positions, in_range)))
%timeit real_positions = list(group)
Результат:
347 ns ± 21.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Поэтому я ожидаю, что весь процесс займет не более 3,5 мкс
Но когда я пытаюсь синхронизировать две операции:
%timeit (_, group) = next(filter(itemgetter(0), groupby(positions, in_range))); real_positions = list(group)
Я получаю следующее:
9.72 µs ± 129 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Почему я получаю гораздо больше времени, чем когда я суммирую отдельные временные интервалы двух операций?
1 Мои лучшие сроки пока:
from itertools import dropwhile, takewhile
def is_upstream(position):
return position < ref_pos - upstream
def not_downstream(position):
return position <= ref_pos + downstream
%timeit real_positions = list(takewhile(not_downstream, dropwhile(is_upstream, positions)))
Результат:
6.7 µs ± 78 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)