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 倍以上。
相关推荐
众数问题---算法与数据结构.pdf
**哈希表方法:** - 遍历输入数据,用哈希表(如Python的字典)记录每个元素及其出现次数。 - 在遍历过程中,同时维护最大出现次数和对应的众数。 - 最后输出众数和最大出现次数。2.
线性代数实战:如何用Python快速计算矩阵对角化(附完整代码)
本文详细介绍了如何使用Python的NumPy库实现矩阵对角化,包括理论基础、代码实现及性能优化技巧。矩阵对角化是线性代数中的核心操作,通过特征值分解(P^(-1)AP形式)可显著提升计算效率,适用于机器学习、量子计算等领域。文章还提供了完整代码示例和常见错误处理方法。
数据分析师笔试实战指南:从业务感出发的12道真题拆解
数据分析不是SQL或Python的技术堆砌,而是将业务问题转化为可计算、可归因、可行动的数据语言的过程。其核心在于理解数据背后的生成逻辑、指标的时间语义与业务定义、异常值的业务成因,以及用户行为与系统监控之间的感知鸿沟。本文围绕真实招聘场景中的高频考点——数据清洗的业务归因、指标设计的场景绑定、SQL表达的逻辑严谨性、AB测试的多层归因、图表解读的三维破局,系统梳理从应届生到3年经验者的关键能力断层点。特别强调‘业务感’与‘时间锚点’两大热词在实战中的决定性作用,帮助读者建立以终为始的数据思维操作系统。
python求众数问题实例
本文讨论了如何使用Python解决众数问题,即找出一个数据集中出现次数最多的元素。通过实例代码展示了如何从文件中读取数据,利用字典统计元素出现的频率,并最终确定众数及其出现次数。在Python中
论文研究-求解非线性方程重根的区间牛顿法.pdf
本文主要探讨了在非线性方程求解中的一个重要挑战——重根问题,特别是当经典的Moore区间牛顿法不再适用或者Hansen改进的区间牛顿法在处理重根时收敛速度较慢的情况下。Moore的区间牛顿法依赖于函数


其他
