博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 快速统计数据的去重数和去重数据
阅读量:4704 次
发布时间:2019-06-10

本文共 2097 字,大约阅读时间需要 6 分钟。

之前用 Python 写过一个脚本,用来处理上千万用户的一些数据,其中有一个需求是统计用户的某一数据的去重数量。为了加快程序的速度,我启用了多进程。但不幸的是,程序跑了近一个星期,还没处理完。这时,我感觉到了不对,于是开始查看程序的性能瓶颈。

对于统计去重数,我是将用户的数据放到一个列表中,然后用 len(set(data)) 去统计去重数量。刚开始我以为这的数据量并不大,每个用户的数据不会过百,我并没有注意到有的用户会有上万条的数据,因此消耗了大量的时间(其实我的脚本消耗时间最大的地方是因为从远程 redis 中取大量数据时发生长时间的阻塞,甚至连接超时,最后我采用的方式分而治之,每次取少量的数据,这样大大的提高了性能)。

为了做优化,我开始寻求高效的方法。我发现,有大量的人认为采用字典效率会更高,即:

data_unique = {}.fromkeys(data).keys()len(data_unique)欢迎加入我的QQ群`923414804`与我一起学习,群里有我学习过程中整理的大量学习资料。加群即可免费获取

于是,我做了下测试:

In [1]: import randomIn [2]: data = [random.randint(0, 1000) for _ in xrange(1000000)]In [3]: %timeit len(set(data))10 loops, best of 3: 39.7 ms per loopIn [4]: %timeit len({}.fromkeys(data).keys())10 loops, best of 3: 43.5 ms per loop

由此可见,采用字典和采用集合的性能是差不多的,甚至可能还要慢些。

在 Python 中其实有很多高效的库,例如用 numpy、pandas 来处理数据,其性能接近于 C 语言。那么,我们就用 numpy 和 pandas 来解决这个问题,这里我还比较了获取去重数据的性能,代码如下:

import collectionsimport random as py_randomimport timeitimport numpy.random as np_randomimport pandas as pdDATA_SIZE = 10000000def py_cal_len():    data = [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)]    len(set(data))def pd_cal_len():    data = np_random.randint(1000, size=DATA_SIZE)    data = pd.Series(data)    data_unique = data.value_counts()    data_unique.sizedef py_count():    data = [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)]    collections.Counter(data)def pd_count():    data = np_random.randint(1000, size=DATA_SIZE)    data = pd.Series(data)    data.value_counts()# Script starts from hereif __name__ == "__main__":    t1 = timeit.Timer("py_cal_len()", setup="from __main__ import py_cal_len")    t2 = timeit.Timer("pd_cal_len()", setup="from __main__ import pd_cal_len")    t3 = timeit.Timer("py_count()", setup="from __main__ import py_count")    t4 = timeit.Timer("pd_count()", setup="from __main__ import pd_count")    print t1.timeit(number=1)    print t2.timeit(number=1)    print t3.timeit(number=1)    print t4.timeit(number=1)

运行结果:

12.4385879040.43590712547314.64318108560.258564949036

利用 pandas 统计数据的去重数和去重数据,其性能是 Python 原生函数的 10 倍以上。

转载于:https://www.cnblogs.com/paisenpython/p/10329895.html

你可能感兴趣的文章
Jquery radio选中
查看>>
memcached 细究(三)
查看>>
RSA System.Security.Cryptography.CryptographicException
查看>>
webservice整合spring cxf
查看>>
[解题报告] 100 - The 3n + 1 problem
查看>>
Entity Framework 学习高级篇1—改善EF代码的方法(上)
查看>>
Mybatis逆向工程配置文件详细介绍(转)
查看>>
String类的深入学习与理解
查看>>
不把DB放进容器的理由
查看>>
OnePage收集
查看>>
Java parseInt()方法
查看>>
yahoo的30条优化规则
查看>>
[CCF2015.09]题解
查看>>
[NYIST15]括号匹配(二)(区间dp)
查看>>
json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:No such file or directory
查看>>
洛谷 P1101 单词方阵
查看>>
Swift DispatchQueue
查看>>
C#和JAVA 访问修饰符
查看>>
小甲鱼OD学习第1讲
查看>>
HDU-1085 Holding Bin-Laden Captive-母函数
查看>>