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微秒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM