[本文出自天外归云的博客园]
电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用。百度百科:
笛卡尔乘积是指在数学中,两个集合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微秒。