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

  • 相关阅读:
    spark 插入数据到mysql时遇到的问题 org.apache.spark.SparkException: Task not serializable
    Linux编译安装python3
    爬取基于Flex技术的网站数据
    转:MySQL到Greenplum迁移分析
    Greenplum基本介绍
    Hive on Spark
    Flume可分布式日志收集系统
    Redis高性能内存数据库
    Kafka 分布式发布-订阅消息系统
    Spark学习之Spark Streaming
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/9138147.html
Copyright © 2011-2022 走看看