[英]How to speed up Python script iterating nested loop?
我正在運行一個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:])
使用集
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)
在撰寫本文時,我意識到您甚至可以做得更好。 python 3中的range函數返回一個序列,因此下一部分需要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")
如果使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.