[本文出自天外歸雲的博客園]
電影異次元殺陣三部曲中密室線索反復出現笛卡爾積的運用。百度百科:
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中的一個成員 。
笛卡爾積的符號化為:A×B={(x,y)|x∈A∧y∈B}
求笛卡爾積的兩種方法如下,第一種是我自己想的方法,第二種方法是用itertools,對比了一下兩種方法的時間消耗,幾次測試下來發現itertools的方法稍微慢一點點:
def calc_time(desc=None): def calc(func): def wrapper(*args, **kwargs): from datetime import datetime start_time = datetime.now() r = func(*args, **kwargs) end_time = datetime.now() print(f"{desc} Used time: {(end_time-start_time).microseconds} Descartes: {r}") return wrapper return calc @calc_time("方法1") def descartes_1(a, b): return [f"{a[i]}{b[j]}" for i in range(len(a)) for j in range(len(b))] @calc_time("方法2") def descartes_2(a, b): import itertools return [f"{i[0]}{i[1]}" for i in itertools.product(a, b)] if __name__ == '__main__': a = [i for i in range(2000)] import string b = [i for i in string.ascii_lowercase] descartes_1(a, b) descartes_2(a, b)
測試結果如下:
在求2000個數字和26個小寫字母笛卡爾積的情況下,第一種方法比第二種快了1000微秒。