python生成序列_在Python中快速生成布尔序列

这看起来效果不错。它返回一个生成器对象,因此唯一的内存使用是n-位整数r。在

别用这个!import random

def rand_bools(n):

r = random.getrandbits(n)

return ( bool((r>>i)&1) for i in xrange(n) )

用法:

^{pr2}$

它的工作原理是连续移位r,屏蔽低位,并在每次迭代中将其转换为bool。在

编辑:这个故事的寓意是对代码进行基准测试!从Blender得到提示后,我编写了以下测试:import random

import time

def test_one(N):

a = 0

t0 = time.time()

for i in xrange(N):

if random.getrandbits(1): a += 1

return time.time() - t0

def rand_bools_int_func(n):

r = random.getrandbits(n)

return ( bool((r>>i)&1) for i in xrange(n) )

def test_generator(gen):

a = 0

t0 = time.time()

for b in gen:

if b: a += 1

return time.time() - t0

def test(N):

print 'For N={0}'.format(N)

print ' getrandbits(1) in for loop {0} sec'.format(test_one(N))

gen = ( not random.getrandbits(1) for i in xrange(N) )

print ' getrandbits(1) generator using not {0} sec'.format(test_generator(gen))

gen = ( bool(random.getrandbits(1)) for i in xrange(N))

print ' getrandbits(1) generator using bool() {0} sec'.format(test_generator(gen))

if (N < 10**6): # Way too slow!

gen = rand_bools_int_func(N)

print ' getrandbits(n) with shift/mask {0} sec'.format(test_generator(gen))

def main():

for i in xrange(3,8):

test(10**i)

if __name__ == '__main__':

main()

结果:C:\Users\Jonathon\temp>python randbool.py

For N=1000

getrandbits(1) in for loop 0.0 sec

getrandbits(1) generator using not 0.0 sec

getrandbits(1) generator using bool() 0.0 sec

getrandbits(n) with shift/mask 0.0 sec

For N=10000

getrandbits(1) in for loop 0.00200009346008 sec

getrandbits(1) generator using not 0.00300002098083 sec

getrandbits(1) generator using bool() 0.00399994850159 sec

getrandbits(n) with shift/mask 0.0169999599457 sec

For N=100000

getrandbits(1) in for loop 0.0230000019073 sec

getrandbits(1) generator using not 0.029000043869 sec

getrandbits(1) generator using bool() 0.0380001068115 sec

getrandbits(n) with shift/mask 1.20000004768 sec

For N=1000000

getrandbits(1) in for loop 0.233999967575 sec

getrandbits(1) generator using not 0.289999961853 sec

getrandbits(1) generator using bool() 0.37700009346 sec

For N=10000000

getrandbits(1) in for loop 2.34899997711 sec

getrandbits(1) generator using not 2.89400005341 sec

getrandbits(1) generator using bool() 3.76900005341 sec

最后,我的回答是“有趣的解决方案,,但不要使用它”!简单地使用random.getrandbits(1)要快得多。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值