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

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

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

data_unique = {}.fromkeys(data).keys()

len(data_unique)

于是,我做了下测试:

In [1]: import random

In [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 loop

In [4]: %timeit len({}.fromkeys(data).keys())

10 loops, best of 3: 43.5 ms per loop

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

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

import collections

import random as py_random

import timeit

import numpy.random as np_random

import pandas as pd

DATA_SIZE = 10000000

def 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.size

def 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 here

if __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.438587904

0.435907125473

14.6431810856

0.258564949036

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

python去重计数_Python 快速统计数据的去重数和去重数据相关推荐

  1. elasticsearch 条件去重_elasticsearch 笔记四 之聚合查询之去重计数、基础统计、百分位、字符串统计...

    这一节笔记还是聚合查询,以下是本节目录:去重统计 cardinality 基础统计 stats 百分位 percentiles 字符串统计 string_stats 1.去重统计 cardinalit ...

  2. python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库

    利用Python进行数据分析中有两个重要的库是Numpy和Pandas,本章将围绕这两个库进行展开介绍. Numpy库 Numpy最重要的一个特点是就是其N维数组对象,即ndarray,ndarray ...

  3. python去重计数_Python list去重及找出,统计重复项

    http://bbs.chinaunix.net/thread-1680208-1-1.html http://www.cnblogs.com/feisky/archive/2012/12/06/28 ...

  4. python中计数_Python中的统计计数

    关闭.此问题不符合堆栈溢出准则.它当前不接受答案. 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题. 6年前关闭. 我有一组五个字母A..E.我想将它们分成3个一组,不重复字母 ...

  5. python 去重 字典_python按照list中字典的某key去重的示例代码

    一.需求说明 当我们写爬虫的时候,经常会遇到json格式的数据,它通常是如下结构: data = [{'name':'小K','score':100}, {'name':'小J','score':98 ...

  6. python r转义_Python快速入门系列之二:还学不会我直播跪搓衣板

    Python作为一个,目前最火的编程语言之一,已经渗透到了各行各业.它易学好懂,拥有着丰富的库,功能齐全.人生苦短,就用Python. 这个快速入门系列分为六篇,包含了Python大部分基础知识,每篇 ...

  7. python 字典计数_python怎么用字典计数

    python用字典计数的方法:1.利用第三方库random生成随机数列表:2.利用字典的get方法取值,如果已存在就加一,不存在就默认值为0:3.得到的字典即为所有数据计数后的字典数据. 首先利用ra ...

  8. python 财务报表 建模_Python进行统计建模

    前言 大家好,在之前的文章中我们已经讲解了很多Python数据处理的方法比如读取数据.缺失值处理.数据降维等,也介绍了一些数据可视化的方法如Matplotlib.pyecharts等,那么在掌握了这些 ...

  9. python docs 举例_Python 快速入门

    Python 快速入门 04/20/2019 本文内容 此快速入门旨在帮助你在 Python 3 中进行第一个 API 调用. 必须具有PlayFab 开发人员帐户,才能调用任何 PlayFab AP ...

最新文章

  1. Google和Baidu常用的搜索技巧--转
  2. python中使用中文字符,文件首行添加# -*- coding: utf-8 -*-后仍然报错(unicode error) ‘utf-8‘ codec can‘t decode byte 0xc4
  3. [总结] 网络流最大流算法反向边的作用
  4. Windows下卸载Oracle
  5. 嵌入式里如何给内存做压力测试?不妨试试memtester
  6. Python3,selenium动态下载某库PPT文档,省下的钱可以撸串了!!!
  7. Android 将签名布局旋转90度,Android签名生成和互转(示例代码)
  8. 蒙特卡洛 光 matlab,用蒙特卡罗法模拟光散射问题
  9. 软件架构设计---产品线及系统演化
  10. 8款能让打工人效率原地飞起的神仙软件,含泪公开
  11. web前端开发免费教程
  12. 开业两月有余的转转二手集市怎么没有声音了?
  13. 下载Gazebo模型
  14. js 判断两个时间相差多少月_js对日期操作 获取两个日期的相差是否在几月之内...
  15. 免费的股票成交额查询接口要到哪里找?
  16. 手机上流行的各类谜语(大揭密)
  17. 缓存就是万金油,哪里有问题哪里抹一下 。那他的本质是什么呢?
  18. word中不能设置首字下沉的一个原因
  19. Python本地安装第三方库步骤
  20. 软件测试入职2个月想辞职了

热门文章

  1. 【纯JAVA语言做RPG游戏】1.做个瓷砖地图生成器
  2. 数字图像处理 线性系统、卷积、傅立叶变换
  3. OSChina 周日乱弹 —— 红领巾聚会
  4. Windows10登录不上Micrsoft账户,解决办法
  5. 用 Python 远程控制 Windows 服务器,简直太方便了~
  6. 单例模式应用场景及实现(By C++)
  7. nuget 构建自己的包_适用于企业的NuGet:持续集成自动构建系统中的NuGet
  8. 循环冗余检验CRC原理
  9. fliecmp库:Python比较文件操作
  10. MATLAB--数字图像处理 HOG+SVM识别手写数字