gpt4 book ai didi

python - 在Python中快速生成 bool 序列

转载 作者:行者123 更新时间:2023-12-01 05:39:28 26 4
gpt4 key购买 nike

我有一个看起来像这样的 for 循环,并且希望让它更快。

mylist = 范围(100)

def normalrandom():
for a in range(100):
b = random.getrandbits(1)
if b==1: #do something with mylist[a]

我的列表有大约 100 个元素,而且我知道随机调用的成本很高。有没有一种更快的方法可以只调用一次 random 并获得 100 个随机 bool 值?

编辑:这是迄今为止最好的解决方案。

def fastrandom(): 
s = list(range(100))
res = [i for i in s if random.random() >= .5]
for item in res:
#do something with mylist[item]
  • 正常随机:0:00:00.591000
  • 快速随机:0:00:00.293000

最佳答案

这似乎工作得很好。它返回一个生成器对象,因此唯一的内存使用是n位整数r

编辑:不要使用这个!

import random

def rand_bools(n):
r = random.getrandbits(n)
return ( bool((r>>i)&1) for i in xrange(n) )

用法:

>>> for b in rand_bools(4): print b
...
False
True
False
True

它的工作原理是连续移位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)要快得多。

关于python - 在Python中快速生成 bool 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17985774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com