Python3求笛卡尔积的两种方法

[本文出自天外归云的博客园]

电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用。百度百科:

笛卡尔乘积是指在数学中,两个集合XY的笛卡尓积(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微秒。

posted @ 2018-06-05 09:41  天外归云  阅读(5069)  评论(0编辑  收藏  举报