В чем разница между random.normalvariate() и random.gauss() в python?
В чем разница между random.normalvariate()
и random.gauss()
?
Они принимают те же параметры и возвращают одно и то же значение, выполняя по существу ту же функцию.
Я понимаю из предыдущего ответа, что random.gauss()
не потокобезопасный, но что это значит в этом контексте? Зачем программисту заботиться об этом? Альтернативно, почему была и безопасная по потоку, и небезопасная версия, включенная в "случайный" Python?
Ответы
Ответ 1
Защищенные текстом фрагменты кода должны учитывать возможные условия гонки во время выполнения. Это приводит к накладным расходам в результате схем синхронизации, таких как мьютексы, семафоры и т.д.
Однако, если вы пишете невозвратный код, обычно не возникает никаких условий гонки, что, по сути, означает, что вы можете писать код, который выполняется быстрее. Полагаю, именно поэтому random.gauss()
был введен, поскольку документ python говорит, что это быстрее, чем потокобезопасная версия.
Ответ 2
Это интересный вопрос. В общем, лучший способ узнать разницу между двумя реализациями python - проверить сам код:
import inspect, random
str_gauss = inspect.getsource(random.gauss)
str_nv=inspect.getsource(random.normalvariate)
а затем вы печатаете каждую из строк, чтобы узнать, как разные источники. Быстрый просмотр кодов показывает, что не только они ведут себя по-разному многопоточно, но также и то, что алгоритмы не совпадают; например, normalvariate
использует то, что называется методом Kinderman и Monahan, в соответствии со следующими комментариями в str_nv
:
# Uses Kinderman and Monahan method. Reference: Kinderman,
# A.J. and Monahan, J.F., "Computer generation of random
# variables using the ratio of uniform deviates", ACM Trans
# Math Software, 3, (1977), pp257-260.
Ответ 3
Я не совсем уверен в этом, но в документации на Python говорится, что random.gauss немного быстрее, поэтому, если вы в порядке с безопасным потоком, вы можете пойти немного быстрее.
Ответ 4
В многопоточной системе вызов random.normalvariate
дважды очень быстро подряд приведет к тому, что внутренний код random.normalvariate
будет запущен дважды, потенциально до того, как первый вызов сможет вернуться. Внутренние переменные могут не быть reset до второй, что может вызвать ошибки в выходе функции.
Последовательные вызовы random.gauss
должны вместо этого ожидать возврата предыдущих вызовов до их вызова.
Преимущество random.normalvariate
заключается в том, что оно быстрее, но может привести к ошибочному результату.