一些python3行为我无法理解

时间:2018-01-01 14:25:58

标签: python-3.x

我使用了以下代码。

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的原因。

1 个答案:

答案 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创建了实际的rangerandom.sample巧妙地使用了range和迭代器...

Doku: