Я создаю итерационный алгоритм (метод Монте-Карло).
Алгоритм возвращает значение на каждой итерации, создавая поток значений.
Мне нужно проанализировать эти значения и остановить алгоритм, когда, скажем, 1000
возвращенные значения не соответствуют некоторым epsilon
.
Я решил реализовать вычисление max
и min
значений последних 1000
значений, а затем вычислить error
по этой формуле (max-min)/min
и сравнить с epsilon
: error<=epsilon
, И если это условие выполнено, остановите итерации и верните результат.
Первая заяц-идея заключалась в том, чтобы использовать новые значения list
и append
, вычисляя значения max
и min
для последних значений 1000
после каждого добавления. .
Тогда я решил, что нет смысла хранить более 10 * последних значений. Итак, я вспомнил о deque
. Это была очень хорошая идея, поскольку сложность добавления и удаления на обоих концах deque
объекта равна O(1)
. Но это не решило проблему необходимости проходить все последние 1000 значений на каждой итерации для вычисления min
и max
.
Тогда я вспомнил, что есть heapq
модуль . Он хранит данные таким образом, чтобы в любой момент эффективно возвращать наименьшее значение. Но мне нужны как самые маленькие, так и самые большие. Кроме того, мне нужно сохранить порядок элементов, чтобы я мог сохранить 1000
последних возвращенных элементов алгоритма, и я не вижу, как я могу добиться этого с heapq
.
Имея в виду все эти мысли, я решил спросить здесь:
Как я могу решить эту задачу наиболее эффективно?