例如,一段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编程是否更注重可读性而不是性能?
答案 0 :(得分:6)
}
以平台C的$
功能为基础,该功能与您的操作系统开发人员知道如何制作一样安全。实际上每个人都使用它的一个实例(如第二个例子)。
这里的性能和可读性之间没有真正的冲突。惯用Python就像:
SystemRandom
答案 1 :(得分:3)
如果有疑问,我通常会看the implementation ...
据我所知,SystemRandom
与Random
(which is reused by all of the module-level functions)完全相同,只是random
方法被换出来调用{{ 1}}。因此,据我所知,您应该能够重用os.urandom
实例。
一般来说,Python编程是否更注重可读性而不是性能?
一般来说,我认为心态是可读性计数和代码的阅读频率高于书面。你应该只花时间(或代码复杂性)优化那些占用大量整个程序运行时间的东西。如果创建和调用SystemRandom
只占整个程序运行时间的一小部分,那么它可能不值得优化,你应该选择更容易阅读的版本。如果需要50%的运行时间并且等待程序完成很烦人,那么您可能需要考虑优化。
当然,话虽如此,我认为你的两个代码片段之间的可读性差异不大,所以......我可能会创建一个并重用它......