随机测试数据生成 与 Pandas迭代方法性能对比
作者:小小明
Faker库生成测试数据
Faker库可以用来生成我们需要的测试数据,安装:
pip install Faker
生成示例:
from faker import Faker
fake = Faker("zh_CN")
fake.profile()
{'job': '驯兽师/助理驯兽师','company': '盟新网络有限公司','ssn': '620922197308261288','residence': '青海省凤兰市花溪杨路u座 985024','current_location': (Decimal('-39.1941315'), Decimal('94.196658')),'blood_group': 'B+','website': ['http://ca.cn/', 'https://shaomao.net/', 'http://68.cn/'],'username': 'chao88','name': '杨坤','sex': 'F','address': '浙江省兴城县西峰叶街C座 376696','mail': 'guiyingfu@gmail.com','birthdate': datetime.date(1951, 2, 3)}
faker 提供的Standard Providers包括:
address | date_time | person | credit_card |
automotive | file | phone_number | currency |
bank | geo | profile | lorem |
barcode | internet | python | misc |
color | isbn | ssn | |
company | job | user_agent |
文档链接:
https://faker.readthedocs.io/en/master/providers.html
于是我们可以通过以下代码批量生成数据:
import numpy as np
import pandas as pd
from faker import Fakerfake = Faker("zh_CN")
size = 1000
person_data = [(fake.name(), fake.address(), fake.phone_number())for _ in range(size)]
df = pd.DataFrame(person_data, columns=['name', 'adress', 'phone'])
df['age'] = np.random.randint(25, 55, size)
df
由于我们只对单列进行迭代,于是只需生成单列的数据,但数据量一定要够大,下面将生成500百万条姓名数据:
import numpy as np
import pandas as pd
from faker import Fakerfake = Faker("zh_CN")
size = 5000000
names = pd.Series([fake.name() for _ in range(size)])
names
经测试生成500万条数据耗时近四分钟。
这对于我来说,感觉还是太慢了,于是我决定换自己写的生成算法试试。
4秒生成500万条随机姓名数据
经过一番尝试写出了如下代码:
def fake_name(size):xing = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛' \'奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康' \'伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵' \'席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经房裘缪干解应宗' \'丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄曲家封芮羿储靳汲邴糜松井段富巫' \'乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘钭厉戎祖武符刘景詹束龙叶幸司韶郜黎蓟薄' \'印宿白怀蒲邰从鄂索咸籍赖卓蔺屠蒙池乔阴鬱胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍卻璩桑桂' \'濮牛寿通边扈燕冀郏浦尚农温别庄晏柴瞿阎充慕连茹习宦艾鱼容向古易慎戈廖庾终暨居衡步都耿满弘' \'匡国文寇广禄阙东欧殳沃利蔚越夔隆师巩厍聂晁勾敖融冷訾辛阚那简饶空曾毋沙乜养鞠须丰巢关蒯相' \'查后荆红游竺权逯盖益桓公万俟司马上官欧阳夏侯诸葛闻人东方赫连皇甫尉迟公羊澹台公冶宗政濮阳' \'淳于单于太叔申屠公孙仲孙轩辕令狐钟离宇文长孙慕容鲜于闾丘司徒司空丌官司寇仉督子车颛孙端木' \'巫马公西漆雕乐正壤驷公良拓跋夹谷宰父谷梁晋楚闫法汝鄢涂钦段干百里东郭南门呼延归海羊舌微生' \'岳帅缑亢况郈有琴梁丘左丘东门西门商牟佘佴伯赏南宫墨哈谯笪年爱阳佟第五言福'ming = '伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清' \'飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善' \'厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家' \'致树炎德行时泰盛秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环' \'雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶' \'怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑筠柔竹霭凝晓欢霄枫芸菲寒欣滢伊亚宜可姬舒影荔枝思丽秀' \'飘育馥琦晶妍茜秋珊莎锦黛青倩婷宁蓓纨苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希'xing = np.array(list(xing))ming = np.array(list(ming))names = pd.Series(np.random.choice(xing, size))names += np.random.choice(ming, size)names.loc[np.random.choice(names.index, size//2, False)] += np.random.choice(ming, size//2)names.loc[np.random.choice(names.index, size//50, False)] += np.random.choice(ming, size//50)return names
经测试生成500万条性能数据仅耗时4秒钟,比fake的4分钟快了60倍:
%time names = fake_name(5000000)
names
Wall time: 4.08 s
0 汝青
1 缑天
2 喻华
3 丘妍强
4 生香...
4999995 全武
4999996 费舒
4999997 裴婷欢
4999998 葛芸
4999999 燕龙
Length: 5000000, dtype: object
测试Pandas的三种迭代的性能
Pandas内置的迭代器函数有很多,但看一眼就知道性能会很低,因为它们都会给跌带出来的每个元素封装一个Series对象,所以也不在本次测试的范围之内。
本次测试的目的是比较Series对象的str处理器、apply方法以及for循环迭代numpy数组的性能。
测试前,我们先随机取100万行数据加上空格:
t1 = np.random.choice(names.index, 1000000, False)
t2 = np.random.choice(names.index, 1000000, False)
names.loc[t1] += ' '
names.loc[t2] = ' '+names.loc[t2]
下面开始测试:
print("names.str.strip()")
%timeit names.str.strip()names.loc[t1] += ' '
names.loc[t2] = ' '+names.loc[t2]
print("names.apply(str.strip)")
%timeit names.apply(str.strip)names.loc[t1] += ' '
names.loc[t2] = ' '+names.loc[t2]
print("[name.strip() for name in names.values]")
%timeit [name.strip() for name in names.values]names.loc[t1] += ' '
names.loc[t2] = ' '+names.loc[t2]
print("[name.strip() for name in names]")
%timeit [name.strip() for name in names]
结果:
names.str.strip()
2.23 s ± 41.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
names.apply(str.strip)
1.44 s ± 28.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
[name.strip() for name in names.values]
1.1 s ± 20.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
[name.strip() for name in names]
1.5 s ± 23.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
可以看到str处理器的向量模式耗时最久,apply方法次之,列表生成式迭代numpy数组反倒是最快的,for循环直接迭代series对象比apply稍慢一点。
实际编码中,我们也会直接使用for循环,而不使用生成式,所以再单独测试for循环迭代numpy数组的性能:
tmp = names.copy()
%%timeit
result = []
for name in tmp.values:result.append(name.strip())
1.17 s ± 21.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
可以看到虽然比列表生成式慢了点,却依然比apply方法快。
结论
经过以上测试,可以确定for循环迭代numpy数组会比apply方法更快,比for循环直接迭代Series对象会比apply稍慢一点;一直被推荐的str向量化操作反倒速度是最慢的。
速度从快到慢排序:
for循环迭代numpy数组 > apply > for循环迭代Series对象 > str向量化 > for循环迭代Series内置迭代器函数
随机测试数据生成 与 Pandas迭代方法性能对比相关推荐
- python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比
[Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...
- 循环下标_【转】【Python效率】五种Pandas循环方法效率对比
[Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...
- Golang byte 拼接方法性能对比
Golang byte 拼接方法性能对比 最近项目上遇到需要将[]Byte进行拼接的需求,对[]Byte拼接的各种方法进行了对比,测试代码如下: package main import (" ...
- Node四种动态加载JS代码方法性能对比
背景 我们运行node程序的时候,一般情况下,js代码都是事先写好在js文件里,然后启动的时候加载到内存中执行的.在一些特殊的需求下,我们可能会执行一些动态的js代码. 四种方法 目前我能想到的方法有 ...
- 遍历DataTable内存数据的三种方法性能对比
http://www.cnblogs.com/guowei1027/archive/2009/12/15/1624699.html 前几年曾经碰到一个生成递归树形菜单的功能,由于系统比较庞大,有300 ...
- python2字典遍历方法性能对比
在公司服务器上跑python2程序时,使用了 tqdm(d.items()) 来包裹字典,发现进度条一直卡在0%不动,怀疑是 d.items() 取出所有的元素作为列表返回,而不是迭代器,导致耗时非常 ...
- java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted
0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...
- 数据库基准测试:database bencnmark --生成大量随机测试数据
先说一下,我也不懂怎么做数据库的基准测试或者说压力测试(Stress test),下面都是我个人的经验之谈. 随机数据的生成我使用Python完成,这样就有普遍性,因为大部分数据库都有Python接口 ...
- PHP生成随机密码的4种方法及性能对比
PHP生成随机密码的4种方法及性能对比 http://www.php100.com/html/it/biancheng/2015/0422/8926.html 来源:露兜博客 时间:2015-04 ...
- 生成特定分布随机数的方法:Python seed() 函数numpy scikit-learn随机数据生成
描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数.. 语法 以下是 seed() 方法的语法: import random random.seed ( [x] ...
最新文章
- R语言ggplot2可视化:使用scale_y_continous函数自定义指定Y轴的坐标范围以及对应的数值、将坐标轴的数值设置为需要的数据类型(整型、浮点型)
- 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
- GUI(一) 一些自已看的东西
- 【白话科普】聊聊 DNS 的那些小知识
- vs里根据json快速创建对应类的方法
- javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》
- 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定
- 并发编程(多进程1)
- 【Java】区分BigDecimal的toString()和toPlainString()
- 【repost】Javascript操作DOM常用API总结
- centos 使用rz sz指令
- php和java环境整合
- 多媒体教室建设方案综述
- 极限理论总结01:随机变量的四种收敛、CMT及Slutsky定理
- sqlserver中的常见函数用法
- 滑动窗口切割图片并重定位标注框
- JSch执行shell命令
- 电子元件行业ERP经典客户案例(电陶)
- 真侍魂_全角色特殊能力
- 疑难杂症之各种小坑合集
热门文章
- 2024考研《艺术学概论》彭吉象|复习笔记(上篇)(1-6章)
- 过滤条件为包括以后期间的数据,期末结存可能不正确,是否继续?
- oracle常见异常——io异常,connection reset
- Java随机生成加减乘除运算,并记录结果
- 谷歌、领英、汇丰、桥水、联合航空、联合利华、雷克萨斯、Expedia、OYO等公司高管变动情况...
- “最强大脑”蒋昌建站台,原来是为这群白帽黑客和少年极客
- 单引号在c语言中作用,我想知道单引号在C语言的具体作用
- modem是插在计算机的什么端口,modem是什么 modem和路由器的区别【详解】
- 高中计算机课听课记录表,信息技术课听课记录
- 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程,宏、插件和辅助的实战编写笔记和视频记录