時間殺手—for迴圈—如何找出兩個list中的相同元素
阿新 • • 發佈:2018-11-10
import numpy
import datetime
a = numpy.random.randint( 5,1000,100000 )
b = numpy.random
startt1 = datetime.datetime.now() l11 = sorted(list(set(a))) l22 = sorted(list(set(b))) l3 = [] x = 0 for i in l11: for j in range(x,len(l22)): if i == l22[j]: l3.append(i) x = j continue endt1 = datetime.datetime.now() print(l3) print(endt1 - startt1)
randint( 5,1000,100000 )print(a)print(b)
當寫完這個程式碼的時候,,筆者跑出了10分鐘的成績,,,,,,,,,,,,,what f..................?????????????????????
為了解決這個問題,筆者決定從減去計算量的角度從新思考這個問題。
如果上圖是兩個列表,那麼是不是左界限的差值就可以不用計算了,,,遵從最小計算量的原則,筆者設定了兩個記錄左邊界限值的兩個類似於指標之類的東西,進行記錄,從左到右爬行。如果兩個值相等,那麼記錄改值,否則,繼續爬行,寫出來的程式碼像是這樣
import numpy import datetime a = numpy.random.randint( 5,100000,100000 ) b = numpy.random.randint( 5,100000,100000 ) print(a) print(b) startt1 = datetime.datetime.now() def fun_x(x): x = x + 1 return x def fun_y(y): y = y + 1 return y def fund_loacation(L1, L2, L3, x=0, y=0): L1 = sorted(set(list(L1))) L2 = sorted(set(list(L2))) while x < len(L1) and y < len(L2): if L1[x] > L2[y]: y = fun_y(y) elif L1[x] < L2[y]: x = fun_x(x) elif L1[x] == L2[y]: L3.append(L1[x]) x = fun_x(x) y = fun_y(y) else: pass return L3 print(fund_loacation(a, b, [])) endt1 = datetime.datetime.now() print(endt1 - startt1)
上述程式碼的時間消耗近乎不計,,,然後我自信的在網路上百度了一下,看別人是如何寫的,然而發現了一個更神奇的方法,就像下面這樣:
startt1 = datetime.datetime.now()
set1 = set(a)
set2 = set(b)
print (set1 & set2)
endt1 = datetime.datetime.now()
print(endt1 - startt1)
測試了一下時間消耗,竟然比我寫的程式碼還要快,也許是因為set集與dict都是雜湊表查詢,所以鍵值比較更快的緣故吧,看來這是今日最佳啊,但是該程式碼有一個侷限,因為set的唯一性,因此只能找出不重複的,如果重複的話,會把重複值刪除掉,因此如果需要保留重複的話需要第二個程式碼。