python中的random.normalvariate()和random.gauss()有什么区别?
What is the difference between random.normalvariate() and random.gauss() in python?
random.normalvariate()
and random.gauss()
有什么区别?
它们采用相同的参数和 return 相同的值,执行基本相同的功能。
我从 previous answer that random.gauss()
is not thread safe 中了解到,但这在这种情况下是什么意思?为什么程序员要关心这个?或者,为什么 Python 的 'random'?
中同时包含线程安全和非线程安全版本
我不完全确定这一点,但 Python 文档说 random.gauss 稍微快一点,所以如果您对非线程安全没问题,那么您可以更快一点。
在多线程系统中,连续快速调用两次 random.normalvariate
将导致 random.normalvariate
的内部代码为 运行 两次,可能在第一次调用之前有机会return。函数的内部变量可能在秒之前没有被重置,这可能会导致函数输出错误。
对 random.gauss
的连续调用必须等待之前对 return 的调用才能被调用。
因此 random.normalvariate
的优点是速度更快,但可能会产生错误的输出。
线程安全的代码段必须考虑到可能的 race conditions during execution. This introduces overhead as a result of synchronization schemes,例如互斥锁、信号量等
但是,如果您正在编写不可重入代码,通常不会出现竞争条件,这实际上意味着您可以编写执行速度更快的代码。我想这就是引入 random.gauss()
的原因,因为 python 文档说它比线程安全版本更快。
这是一个有趣的问题。一般来说,了解两个 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.
random.normalvariate()
and random.gauss()
有什么区别?
它们采用相同的参数和 return 相同的值,执行基本相同的功能。
我从 previous answer that random.gauss()
is not thread safe 中了解到,但这在这种情况下是什么意思?为什么程序员要关心这个?或者,为什么 Python 的 'random'?
我不完全确定这一点,但 Python 文档说 random.gauss 稍微快一点,所以如果您对非线程安全没问题,那么您可以更快一点。
在多线程系统中,连续快速调用两次 random.normalvariate
将导致 random.normalvariate
的内部代码为 运行 两次,可能在第一次调用之前有机会return。函数的内部变量可能在秒之前没有被重置,这可能会导致函数输出错误。
对 random.gauss
的连续调用必须等待之前对 return 的调用才能被调用。
因此 random.normalvariate
的优点是速度更快,但可能会产生错误的输出。
线程安全的代码段必须考虑到可能的 race conditions during execution. This introduces overhead as a result of synchronization schemes,例如互斥锁、信号量等
但是,如果您正在编写不可重入代码,通常不会出现竞争条件,这实际上意味着您可以编写执行速度更快的代码。我想这就是引入 random.gauss()
的原因,因为 python 文档说它比线程安全版本更快。
这是一个有趣的问题。一般来说,了解两个 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.