zoukankan      html  css  js  c++  java
  • python 快速比较大文件的元素异同之处

    0x00 问题

    假如,在有两个大文件分别存储了大量的数据,数据其实很简单就是一堆字符串,每行存储一条,如何快速筛选出两个文件的异同之处么,或者如何筛选出两个文件中不同的元素呢?

    刚开始我是通过最简单的方法,利用for循环去一个个的判断,时间复杂度为m的n次幂,当然当文件数量级为十万或者百万时,速率简直慢到了极点。

    0x01 解决方法

    利用set()的different(方法)可快速比较,两个set集合的不同之处,也就是对集合进行数学运算

    假设:数据1拥有858882条记录,数据2有360029条记录,快速挑选出数据2中而不存在与数据1中的数据

    方法:先将两个文件中的数据读入两个list:data1和data2,然后通过:set(data2).difference(set(data1)),获取data2与data1的差集

    下面为一个小的demo,可以看到近百万级的数据,比较出差集也就需要1秒左右,效率不是一般的高

    import time
    t1 = time.time()
    data1 = []
    for i in open("inDB.txt","r",encoding="utf-8"):
        i = i.strip("
    ")
        i = i.lower()
        data1.append(i)
    data2 = []
    for i in open("data/18年.filename","r",encoding="utf-8"):
        i = i.strip("
    ")
        i = i.lower()
        data2.append(i)
    newdata = set(data2).difference(set(data1))
    t2 = time.time()
    
    print(f"data1 length:	{len(data1)}")
    print(f"data2 length:	{len(data2)}")
    print(f"newdata length:	{len(newdata)}")
    print(f"time use:	{round(t2 - t1,3)}s")

    在这里插入图片描述

     

    0x02 list最多可以存放多少条数据呢?

    python中list最多可以存放多少条数据呢?

    对于这个问题,有个网友调研了python的文档,结果跟计算机的性能相关

    64位机器:2^63-1=9223372036854775807
    32位机器:2^31-1=2147483647
    import sys
    print(sys.maxsize)
    print(pow(2,63)-1)
    9223372036854775807
    9223372036854775807
    参考:https://blog.csdn.net/TracelessLe/article/details/107281279

     

    0x03 集合set的操作

     
    内置函数作用
    add() 为集合添加元素
    clear() 移除集合中的所有元素
    copy() 拷贝一个集合
    difference() 返回多个集合的差集
    difference_update() 移除集合中的元素,该元素在指定的集合也存在。
    discard() 删除集合中指定的元素
    intersection() 返回集合的交集
    intersection_update() 返回集合的交集。
    isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
    issubset() 判断指定集合是否为该方法参数集合的子集。
    issuperset() 判断该方法的参数集合是否为指定集合的子集
    pop() 随机移除元素
    remove() 移除指定元素
    symmetric_difference() 返回两个集合中不重复的元素集合。
    symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
    union() 返回两个集合的并集
    update() 给集合添加元素
  • 相关阅读:
    Servlet3.0-使用注解定义Servlet
    poj 1256 Anagram—next_permutation的神奇应用
    poj 1664 放苹果 (划分数)
    poj 1011 Sticks
    poj和hdu部分基础算法分类及难度排序
    Notepad++支持jQuery、html5、css3
    Codeforces Round #395 (Div. 2) C. Timofey and a tree
    Codeforces Round #390 (Div. 2) D. Fedor and coupons
    bazel-编译动态库
    bazel-编译多目标
  • 原文地址:https://www.cnblogs.com/cherylgi/p/13533566.html
Copyright © 2011-2022 走看看