重用SystemRandom是一种很好的Python实践吗?

时间:2016-05-18 20:56:25

标签: python random

例如,一段Python代码,用于在字母“abcdef”中生成100万个随机字符串。

比较

from random import SystemRandom

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

from random import SystemRandom

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

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

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

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

2 个答案:

答案 0 :(得分:6)

}以平台C的$功能为基础,该功能与您的操作系统开发人员知道如何制作一样安全。实际上每个人都使用它的一个实例(如第二个例子)。

这里的性能和可读性之间没有真正的冲突。惯用Python就像:

SystemRandom

答案 1 :(得分:3)

如果有疑问,我通常会看the implementation ...

据我所知,SystemRandomRandomwhich is reused by all of the module-level functions)完全相同,只是random方法被换出来调用{{ 1}}。因此,据我所知,您应该能够重用os.urandom实例。

  

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

一般来说,我认为心态是可读性计数代码的阅读频率高于书面。你应该只花时间(或代码复杂性)优化那些占用大量整个程序运行时间的东西。如果创建和调用SystemRandom只占整个程序运行时间的一小部分,那么它可能不值得优化,你应该选择更容易阅读的版本。如果需要50%的运行时间并且等待程序完成很烦人,那么您可能需要考虑优化。

当然,话虽如此,我认为你的两个代码片段之间的可读性差异不大,所以......我可能会创建一个并重用它......