zoukankan      html  css  js  c++  java
  • 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微秒。

  • 相关阅读:
    Netty 超时机制及心跳程序实现
    ZJUTACM
    寻找素数对
    HDU 1021 Fibonacci Again
    HDU 1019 Least Common Multiple
    HDU 1017 A Mathematical Curiosity
    HDU 1014 Uniform Generator
    HDU 1013 Digital Roots
    HDU 1008 Elevator
    Educational Codeforces Round 2 B. Queries about less or equal elements
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/9138147.html
Copyright © 2011-2022 走看看