2016-04-15 36 views
2

我正在运行一个Python脚本,它迭代两个巨大的列表并找到匹配的对。如何加速Python脚本迭代嵌套循环?

但是,它似乎需要永远。如何加快这个脚本?

import sys 
import random 
import itertools 

def main(args): 
    target_num = int(999999999) 
    num_list = range(1, target_num) 
    rand_list = [] 
    hit_list = [] 

    for _ in itertools.repeat(None, target_num): 
     rand_list.append(random.randint(1, target_num)) 

    for num in num_list: 
     for rand_num in rand_list: 
      if num == rand_num: 
       print "hit" 

if __name__ == "__main__": 
    main(sys.argv[1:]) 
+1

尽量不要在代码中使用内置名称作为变量名称,它有可能导致沮丧。通过这个我指的是你使用'list'作为变量名称 – smac89

+0

@ Smac89我急于写一个问题,并犯了一个错误。我修改了变量名称。 – Han

+0

第二个嵌套循环应该是'read_list'还是'rand_list'? – smac89

回答

3

使用设置

import sys 
import random 
import itertools 

def main(args): 
    target_num = int(999999999) 
    num_list = set(range(1, target_num)) 
    rand_list = [] 
    hit_list = [] 

    for _ in itertools.repeat(None, target_num): 
     rand_list.append(random.randint(1, target_num)) 


    for num in rand_list: 
     if num in num_list: # O(1) 
      print "hit" 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

使用关于第一列表的一组,表示检查,如果该项目是在该列表中现降低到O(1)


在写这篇文章时,我意识到你甚至可以做得更好。该range功能在Python 3返回一个序列,所以你需要的Python 3这下部分

import sys 
import random 
import itertools 

def main(args): 
    target_num = int(999999999) 
    num_list = range(1, target_num) # this is a generator 
    rand_list = [] 
    hit_list = [] 

    for _ in itertools.repeat(None, target_num): 
     rand_list.append(random.randint(1, target_num)) 


    for num in rand_list: 
     if num in num_list: # Stil O(1) 
      print ("hit") 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

更妙的是,使用范围和做的第一循环中的检查?

for _ in itertools.repeat(None, target_num): 
    rand_num = random.randint(1, target_num) 
    rand_list.append(rand_num) 
    if rand_num in num_list: 
     print ("hit") 
+0

'O(1)'成员资格测试不是'xrange'的一个特性,它只在Python 3.2中被添加到范围中,当他们最终完成了'范围'的序列ABC](https:// docs。 python.org/3/library/stdtypes.html#range)。 'xrange'成员资格测试会一次生成并测试一个值,直到遇到问题。此外,'范围'和'xrange'都不是发电机;它们或多或少可以产生迭代器的Se​​quence对象,而不是迭代器/发生器本身;如果他们是发电机,重复他们一次会耗尽他们,但那不是他们的行为。 – ShadowRanger

+0

@ShadowRanger你是对的 – smac89

1

如果使用Python 2,请使用xrange(),它返回一个类似生成器的对象。

# requires Python 2 
import random 

target_num = 99 # 999999999 are too much items for testing 

# target_num random numbers in range 1 .. target_num-1 
random_numbers = set(random.randint(1, target_num) for _ in xrange(target_num)) 

hits = set() 
for num in xrange(1, target_num): # check for all numbers in range 1 .. target_num-1 
    if num in random_numbers: # num in set() is O(1) 
     hits.add(num) 

if len(random_numbers - hits) == 0: 
    print "all random numbers are hits!" 

# so: 
for num in random_numbers: 
    print num 
# is the same result