Не совсем, чтобы ответить на вопрос, который является довольно основным c CS 101 вопросом, который люди должны попытаться выяснить сами, но что я заметил относительно хорошего ответа @blhsing, так это то, что он выглядел довольно медленно. Я обнаружил, что mean()
невероятно медленно!
from itertools import groupby, count
from statistics import mean
from timeit import timeit
def generate_1step_seq1(xs):
result = []
n = 0
while n < len(xs):
# sequences with step of 1 only
if not result or xs[n] == result[-1] + 1:
result += [xs[n]]
else:
# int result, rounding down
yield sum(result) // len(result)
result = [xs[n]]
n += 1
if result:
yield sum(result) // len(result)
def generate_1step_seq2(xs):
c = count()
return [int(sum(xs) // len(xs)) for xs in [list(g) for _, g in groupby(xs, key=lambda i: i - next(c))]]
def generate_1step_seq3(xs):
c = count()
return [int(mean(g)) for _, g in groupby(xs, key=lambda i: i - next(c))]
values = [0, 1, 5, 6, 7, 10, 15]
print(list(generate_1step_seq1(values)))
print(generate_1step_seq2(values))
print(generate_1step_seq3(values))
print(timeit(lambda: list(generate_1step_seq1(values)), number=10000))
print(timeit(lambda: list(generate_1step_seq2(values)), number=10000))
print(timeit(lambda: list(generate_1step_seq3(values)), number=10000))
Изначально я подумал, что это, вероятно, связано с небольшим размером списка, но даже для больших списков, mean()
ужасно медленно. Кто-нибудь случайно знает почему? Похоже, из-за очень безопасного характера statistics
_sum
, пытаясь избежать float
ошибок округления?