# do this:
import random
for x in xrange(SOMEVERYLARGENUMBER):
n = random.randint(1,1000) # whatever your range of random numbers is
# Do stuff with n
# don't do this:
import random
# This list comprehension generates random numbers in a list
numbers = [random.randint(1,1000) for x in xrange(SOMEVERYLARGENUMBER)]
for n in numbers:
# Do stuff with n
每次生成一个随机数。由于循环的内部工作只关心单个随机数,因此在循环内生成并使用它。
示例:
显然,实际上这并不重要,除非你要处理数十亿次的迭代,但是如果你一次只使用一个,为什么还要费心生成所有这些数字呢?
Python内置的
random
模块,例如random.random()
,random.randint()
(一些发行版也可用,您可能希望使用gaussian)可以处理大约300K个样本/s由于您正在进行数值计算,因此可能无论如何都要使用
numpy
,如果您一次生成一个随机数数组,而不是一次生成一个随机数,并且可以选择更广泛的分布,那么性能会更好。60K/s*1024(阵列长度),约为60M个采样/s您还可以在Linux和OSX上阅读
/dev/urandom
。我的硬件/软件(osx笔记本电脑)管理约10MB/s当然,必须有更快的方法来集体生成随机数,例如:
在单个i5-4670K内核上产生200MB/s
像aes和blowfish这样的普通密码在我的堆栈上分别管理112MB/s和70MB/s。此外,现代处理器使aes的速度更快,最高可达700MB/ssee this link to test runs on few hardware combinations。(编辑:链接断开)。您可以使用较弱的ECB模式,前提是向其提供不同的输入,并实现高达3GB/s的速度
流密码更适合这项任务,例如RC4在我的硬件上以300MB/s的速度拔得头筹,你可能会从大多数流行的密码中得到最好的结果,因为你花了更多的精力来优化它们和软件。
括号之间的代码一次只能生成一个项,因此是内存安全的。
相关问题 更多 >
编程相关推荐