Политика совместимости#

numpy.random имеет несколько более строгую политику совместимости, чем остальная часть NumPy. Пользователи псевдослучайности часто имеют варианты использования, требующие возможности воспроизводить запуски в мельчайших деталях при том же начальном значении (так называемая «совместимость потока»), поэтому мы стараемся балансировать эти потребности с гибкостью улучшения наших алгоритмов. NEP 19 описывает эволюцию этой политики.

Основной вид совместимости, который мы обеспечиваем, - это совместимость потоков данных от запуска к запуску при определенных условиях. Если вы создаете Generator с тем же BitGenerator, с тем же начальным значением, выполняют ту же последовательность вызовов методов с теми же аргументами, в той же сборке numpy, в той же среде, на той же машине, вы должны получить ту же последовательность чисел. Обратите внимание, что эти условия очень строгие. Существует ряд факторов вне контроля NumPy, которые ограничивают нашу способность гарантировать что-либо большее, чем это. Например, разные процессоры по-разному реализуют арифметику с плавающей точкой, и это может вызывать различия в определённых крайних случаях, которые каскадно распространяются на остальную последовательность. Generator.multivariate_normal, для другого примера, использует матричное разложение из numpy.linalg. Даже на той же платформе, другая сборка numpy может использовать другую версию этого алгоритма разложения матрицы, отличную от LAPACK, к которому он привязан, что вызывает Generator.multivariate_normal возвращать совершенно разные (но одинаково валидные!) результаты. Мы стремимся предпочитать алгоритмы, более устойчивые к этим эффектам, но это всегда несовершенно.

Примечание

Большинство Generator методы позволяют извлекать несколько значений из распределения как массивы. Запрашиваемый размер этого массива является параметром, для целей вышеуказанной политики. Вызов rng.random() 5 раз не гарантировано чтобы дать те же числа, что и rng.random(5)Мы оставляем за собой право решать использовать разные алгоритмы для блоков разного размера. На практике это происходит редко.

Как и остальная часть NumPy, мы обычно сохраняем совместимость API исходного кода от версии к версии. Если мы должен внести критическое изменение API, тогда мы сделаем это только с соответствующим периодом устаревания и предупреждениями, согласно общая политика NumPy.

Нарушение совместимости потока для введения новых функций или улучшения производительности в Generator или default_rng будет разрешено с осторожностьТакие изменения будут считаться новыми возможностями и, следовательно, не будут выпускаться быстрее стандартного графика выпуска новых функций (т.е. на X.Y релизах, никогда X.Y.Z). Медленная работа не будет считаться ошибкой для этой цели. Исправления ошибок корректности, которые нарушают совместимость потоков, могут происходить в релизах исправлений ошибок, как обычно, но разработчики должны рассмотреть, могут ли они подождать до следующего релиза функций. Мы рекомендуем разработчикам тщательно взвешивать неудобства пользователей от нарушения совместимости потоков против улучшений. Один пример ценного улучшения — изменение алгоритмов для значительного увеличения производительности, например, переход от Преобразование Бокса-Мюллера метод генерации гауссовых величин к более быстрому Алгоритм Зиккурат. Примером нежелательного улучшения может быть небольшая настройка таблиц Ziggurat для небольшого прироста производительности.

Примечание

В частности, default_rng разрешено изменять значение по умолчанию BitGenerator что он использует (снова, с осторожность и множество предварительных предупреждений).

В общем случае, BitGenerator классы имеют более строгие гарантии совместимости потока от версии к версии. Это позволяет им быть более надежным строительным блоком для пользователей, которым это необходимо. Их ограниченная поверхность API облегчает поддержание этой совместимости от версии к версии. См. строки документации каждого BitGenerator класс для их индивидуальных гарантий совместимости.

Устаревший RandomState и связанные вспомогательные функции имеют более строгие гарантии совместимости от версии к версии. По причинам, изложенным в NEP 19, мы давали более строгие обещания о стабильности между версиями на ранних этапах разработки NumPy. Все еще есть некоторые ограниченные случаи использования такой совместимости (например, генерация данных для тестов), поэтому мы поддерживаем максимально возможную совместимость. Больше не будет изменений в RandomState, даже для исправления ошибок корректности. Есть несколько серых зон, где мы можем внести незначительные исправления, чтобы сохранить RandomState работает без segfault при изменении внутренней структуры NumPy, и некоторые исправления docstring. Однако упомянутые ранее предостережения о вариативности от машины к машине и от сборки к сборке всё ещё применяются к RandomState так же, как и Generator.