Краткая справка: у нас есть большая исходная база, написанная на Python. Это компилятор для предметно-ориентированного языка, а внутри все представлено в виде ориентированных графов. Эти орграфы построены из наборов, поэтому мы используем встроенный тип набора в Python.
Проблема в том, что мы изначально не осознавали, что Python активно использует отсутствие гарантии упорядочения в заданном объекте, чтобы использовать более быструю недетерминированную реализацию. Поэтому, когда вы перебираете объекты в наборе (как мы часто это делаем), порядок их возврата является слабо случайным. Он не меняется при каждом выполнении, но часто меняется. Из того, что я видел при отладке нашего кода, кажется, что хэш исходного кода действует как начальное число для генератора случайных чисел. Таким образом, изменение кода даже в пути, который не выполняется, приводит к тому, что итератор набора меняет порядок, в котором генерируются элементы.
Наша основная стратегия отладки заключается в сбрасывании отпечатков туда, где мы считаем ошибку, уточняя их на основе выходных данных, пока мы не найдем ошибку. Не очень элегантно, но в большинстве случаев это работает. Основные проблемы заключаются в том, что добавление / изменение любого оператора печати вызывает другое поведение и дико иной путь выполнения. Мы не можем позволить себе печатать / регистрировать все, так как это замедляет время выполнения компилятора с примерно 20 секунд (управляемый) до примерно часа (не так управляемый).
Как бы вы диагностировали проблему, которая возникает нечасто и исчезает, когда вы начинаете ее искать?
Изменить для уточнения :
Несколько ответов предлагают способы исправить порядок наборов. Как говорит torkildr ниже: «Проблема здесь не в том, что наборы ведут себя странно, а в том, что ваша программа ведет себя так, как будто она не работает». Это как раз проблема, но решение не в том, чтобы использовать детерминированные множества. Это просто замаскирует поведение. Проблема состоит в том, чтобы найти , почему наша программа ведет себя так и исправляет такое поведение. Алгоритмы, которые мы используем, должны работать с графами, представленными как неупорядоченные множества. Они не Мне нужно выяснить, где эти ошибки и почему они возникают.
Проблема решена :
Оказывается, что в реализации Python, которую я использую (2.6 в OS-X), если связь между методами __eq__
и __hash__
объектов, хранящихся в наборе, не совсем корректна, то система проявляет описанное слабо случайное поведение. В реализации C. set.add () должен быть некоторый код, который использует что-то из случайного модуля для построения представления. Это вызывает зависимость от системного пула энтропии, который меняет порядок записи на диск.
Прямых ответов нет, но чтение последующего вопроса Крисса заставило проницательность решить эту проблему, и он получил голос.