我使用了以下代码。
from collections import defaultdict
from random import randint, randrange,choice, shuffle
def random_array(low, high, step, size):
lst = []
while len(lst)<size:
nexts = randrange(low, high, step)
if nexts in lst:continue
lst.append(nexts)
return lst
def find_pair_from_two_list(a, b, val):
b_dict = defaultdict(int)
for i,v in enumerate(b): b_dict[v] = i
for v in a:
if (val - v) in b_dict:
return v, val-v
return -1, -1
arr1 = random_array(1, 100, 1, 99)
arr2 = random_array(1, 100, 1, 99)
val1 = choice(arr1)
val2 = choice(arr2)
val = val1 + val2
print(find_pair_from_two_list(arr1,arr2, val))
但是,如果我在
中更改大小值 arr1 = random_array(1, 100, 1, 99)
arr2 = random_array(1, 100, 1, 99)
高达99它可以立即工作,但如果我将任何尺寸值更改为100或更多,它似乎只是挂在那里。 我很想知道为什么会发生这种情况。我的意思是它一直运行到99,但是导致它挂起甚至100的原因。
答案 0 :(得分:0)
为什么你的速度慢?
使用arr1 = random_array(1, 100, 1, 100)
您的方法可能需要花费大量时间来绘制最后丢失的数字,因为您反复绘制新的随机值并在结果列表中已经丢弃它们时将其丢弃:
while len(lst)<size:
nexts = randrange(low, high, step)
if nexts in lst:continue # discards already inside numbers
lst.append(nexts)
return lst
通过这样的输入,您基本上可以画出所有&#34;可能的数字,直到完成,你的结果越多,绘制另一个&#34;拟合&#34;之一。
如果range(low,high,steps)
的总价值低于您的size
要求,您甚至可以制作无限循环。
(1,100,5,100) # => only 20 in this range with this stepper -> endless loop
可能的简化(非最佳)
您可以通过以下方式简单地加速代码:
import random
def random_array(low, high, step, size):
poss = list(range(low,high,step)) # this does not contain duplicates
random.shuffle(poss) # shuffle it
return poss[:size] # return size (or all) elements from it
print(random_array(1,100,1,10))
如果您指定&#34;错误&#34;此代码将返回组合,但结果列表 更短 ,就像您指定为size
一样。
更好
jonsharpe建议使用
random.sample(range(low,high,step),size)
像这样:
def ra(low,high,step,size):
return random.sample(range(low,high,step),size)
效果测试
从绩效角度来看,random.sample
可以轻松胜过我的大名单:
import random
def random_array(low, high, step, size):
poss = list(range(low,high,step))
random.shuffle(poss)
return poss[:size]
def ra(low,high,step,size):
return random.sample(range(low,high,step),size)
import timeit
if __name__ == '__main__':
import timeit
# create 100 times 495 randoms of range (1,1000000,22)
print(timeit.timeit("ra(1,1000000,22,495)", setup="from __main__ import ra",number = 10000))
print(timeit.timeit("random_array(1,1000000,22,495)", setup="from __main__ import random_array",number = 10000))
输出:
1.1825043768664596 # random.sample(...) of range(...)
92.12594874871951 # mine
原因可能是我从list
创建了实际的range
,random.sample
巧妙地使用了range
和迭代器...
Doku: