重用SystemRandom是好的Python实践吗?

重用SystemRandom是好的Python实践吗?,python,random,Python,Random,例如,一个Python代码块可以从字母“abcdef”中生成100万个随机字符串 比较 from random import SystemRandom for _ in range(1000000): ''.join(SystemRandom().choice('abcdef') for __ in range(5)) 与 我在IPython上计时。第一个街区花了50秒,第二个街区花了30秒。我没有测量内存使用情况 在Java中,有一个SecureRandom,其中模式很明显应该创建

例如,一个Python代码块可以从字母“abcdef”中生成100万个随机字符串

比较

from random import SystemRandom

for _ in range(1000000):
    ''.join(SystemRandom().choice('abcdef') for __ in range(5))

我在IPython上计时。第一个街区花了50秒,第二个街区花了30秒。我没有测量内存使用情况

在Java中,有一个SecureRandom,其中模式很明显应该创建一次并重用。从Java到Python,我不清楚是否应该创建一个SystemRandom实例并重用它。第一个块更容易阅读,性能似乎也不太差


一般来说,Python编程是否更注重可读性而不是性能?

当有疑问时,我通常会看

据我所知,
SystemRandom
的工作原理与
Random
()几乎完全相同,只是
Random
方法被调出调用
os.urandom
。因此,据我所知,您应该能够重用
SystemRandom
实例

一般来说,Python编程是否更注重可读性而不是性能

总的来说,我认为人们的心态是可读性很重要,代码的阅读频率高于编写的频率。您应该只花时间(或代码复杂度)优化那些占用大量程序运行时间的事情。如果创建和调用
SecureRandom
只占整个程序运行时间的一小部分,那么它可能不值得优化,您肯定应该使用更易于阅读的版本。如果需要50%的运行时间,而等待程序完成是令人讨厌的,那么您可能需要考虑优化


当然,尽管如此,我认为您的两个代码片段之间的可读性没有太大差异,所以。。。我可能会创建一个并重用它…

SystemRandom
构建在平台C的
urandom()
函数上,该函数的安全性与操作系统开发人员所知道的一样。几乎每个人都使用它的一个实例(如第二个示例)

性能和可读性之间没有真正的冲突。惯用Python类似于:

from random import SystemRandom
r = SystemRandom()
choice = r.choice

for _ in range(1000000):
    ''.join(choice('abcdef') for _ in range(5))

实际上,我忘了问一个更重要的问题:重用单个实例是否安全。感谢您首先指出这一点。这是创建
SystemRandom
的费用还是使用其方法的费用?据我所知,
self.random()
是从
self.choice()
内部调用的,
SystemRandom()
是调用
urandom()
——而不是
SystemRandom.\uu init\uuuuuuuu
。当然-但我不认为有必要用更多的话来阐明,创建从未使用过的东西是便宜的;-)但是第三种想法是,所有实例都使用相同的
uradom()
platform实例,因此我将删除关于费用的部分-我同意这充其量只是误导。
from random import SystemRandom
r = SystemRandom()
choice = r.choice

for _ in range(1000000):
    ''.join(choice('abcdef') for _ in range(5))