用Python生成测试数据
转载自:http://blog.csdn.net/caz28/article/details/45972109
有时我们需要大量的数据,一般编个程序生成一堆随机数据,Python很适合文本处理,干这个很方便。
下面程序生成一千万条数据,空格分开。
1 |
# 生成数据库文件,用于测试SQL数据库
# id,firstName(14),lastName(14),birthday,sex
import random,datetime
import time
dataCount = 10*1000*1000 #10M.
codeRange = range(ord('a'),ord('z'))
alphaRange = [chr(x) for x in codeRange]
alphaMax = len(alphaRange)
daysMax = 42003
theDay = datetime.date(1900,1,1)
def genRandomName(nameLength):
global alphaRange,alphaMax
length = random.randint(1, nameLength)
name = ''
for i in range(length):
name += alphaRange[random.randint(0,alphaMax-1)]
return name
def genRandomDay():
global daysMax,theDay
mDays = random.randint(0,daysMax)
mDate = theDay + datetime.timedelta(days=mDays)
return mDate.isoformat()
def genRandomSex():
return random.randint(0,1)
def genDataBase1(fileName,dataCount):
outp = open(fileName,'w')
i = 0
while i<dataCount:
firstName = genRandomName(14)
lastName = genRandomName(14)
birthday = genRandomDay()
sex = genRandomSex()
mLine = "%i %s %s %s %d\n"%(i+1,firstName,lastName,birthday,sex)
outp.write(mLine)
i += 1
outp.close()
if __name__ == "__main__":
random.seed()
start = time.time()
genDataBase1('db_test.txt',dataCount)
end = time.time()
print('use time:%d'%(end-start))
print('Ok')
|
来自CODE的代码片
一条数据长度随机,平均38个字节左右,总共生成370MB左右的数据文件,用时23分钟左右。
测试了哪个地方是性能瓶颈,发现用时最长是genRandomName函数,而且每条数据调用两次,第二长的是genRandomDay。
genRandomName 用时是 genRandomDay 的 7倍,genRandomDay 里也没什么可优化的,所以重点优化genRandomName。
在Python中尝试了几种方法:
1.先生成字符列表,再join,而不是用+。
2.用random.sample。
提高速度都不明显,小于10%。
后来发现不做字符串操作,速度也提高有限,random操作看来比较耗时间。
于是写了一个C语言dll,通过ctypes使用,提高速度明显,同样是一千五条,用时8.65分钟。
1 |
# 使用C语言库优化字符串生成
# 生成数据库文件,用于测试SQL数据库
# id,firstName(14),lastName(14),birthday,sex
import ctypes
import random,datetime
import time
dataCount = 10*1000*1000 #10M.
codeRange = range(ord('a'),ord('z'))
alphaRange = [chr(x) for x in codeRange]
alphaMax = len(alphaRange)
daysMax = 42003
theDay = datetime.date(1900,1,1)
ss = ctypes.CDLL('c_dll.dll')
p = ctypes.create_string_buffer(14+1)
def genRandomName(nameLength):
global ss,p
length = random.randint(1, nameLength)
ss.func(p,length) # c函数随机生成length长度的字符串。
name = p.value.decode('ascii')
return name
def genRandomDay():
global daysMax,theDay
mDays = random.randint(0,daysMax)
mDate = theDay + datetime.timedelta(days=mDays)
return mDate.isoformat()
def genRandomSex():
return random.randint(0,1)
def genDataBase1(fileName,dataCount):
outp = open(fileName,'w')
i = 0
while i<dataCount:
firstName = genRandomName(14)
lastName = genRandomName(14)
birthday = genRandomDay()
sex = genRandomSex()
mLine = "%i %s %s %s %d\n"%(i+1,firstName,lastName,birthday,sex)
outp.write(mLine)
i += 1
outp.close()
if __name__ == "__main__":
ss.randomSeed() # c函数rand初始化seed。
random.seed()
start = time.time()
genDataBase1('db_test.txt',dataCount)
end = time.time()
print('use time:%d'%(end-start))
ss = None
print('Ok')
|
来自CODE的代码片
c_dll是用c实现的生成任意长度的随机字符串的函数,编译成dll,放到Python程序相同目录下调用。
1 |
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int getRand(int max)
{
int i = rand();
double f = (double)i / (double)(RAND_MAX+1);
return (int)(f*(double)max);
}
void _declspec(dllexport)func(char *p,int len)
{
int i;
for(i=0;i<len;i++)
{
*(p+i) =(char)('a'+getRand(26));
}
*(p+i) = '\0';
}
void _declspec(dllexport)randomSeed(void)
{
srand((unsigned)time(NULL));
}
|
来自CODE的代码片
后来,用c实现的randInt函数代替Python的,用时5.3分钟,相对原来23分钟,速度提高4.34倍。
使用navicat导入mysql的导入向导时注意选择日期分隔符为“-”,否则导入日期均为0000-00-00。
txt加上列名,那么导入向导就从第二行数据开始。其他则均不变。
用Python生成测试数据的更多相关文章
- Python生成测试数据-Faker(非LOL选手-李相赫)
Faker介绍 官方文档:https://faker.readthedocs.io/en/master/ Faker is a Python package that generates fake d ...
- python生成excel测试数据
在功能测试时,经常会测到excel文件导入导出的功能,导入与导出时,需要测试系统单次导入大批量数据时是否正常, 如果系统承受不起太大的数据导入,则需要开发限制单次导入的数量,以防止系统服务异常.大量的 ...
- 通过 Python_Faker 生成测试数据
通过 Python_Faker 生成测试数据 一.介绍 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,你不可能通过手工来生成(最傻的方法)可能 ...
- 使用Hypothesis生成测试数据
Hypothesis是Python的一个高级测试库.它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据.可以用更少的工作在代码中发现更多的bug. 安装 pip install hyp ...
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...
- db:seed 更好的生成测试数据
make:model -m -> 在database/migrations/目录下生成的table表中设置表的字段名和字段类型->在app/目录下对应的模型文件中设置可添加字段 -> ...
- Powerdesigner中如何生成测试数据
设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...
- 【python】【转】Python生成随机数的方法
如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文 ...
- Python生成随机数的方法
这篇文章主要介绍了Python生成随机数的方法,有需要的朋友可以参考一下 如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与 ...
随机推荐
- 在Ubuntu Server 14.04中搭建FTP服务器(VMWare)
自己搭建ftp服务器,方便主机与虚拟机中的Ubuntu传输文件. 选用的ftp软件为vsftpd. 1.命令行: sudo apt-get install vsftpd 2.安装完配置: vsftpd ...
- "高大上" 名词整理
大家在和朋友,同行交流时有没有经常遇到各种 "高大上" 的术语,很多词有没有把各位 “鸟哥” 们搞得一头雾水,现在我就把这些 "牛逼" 的东东都罗列一下, 大家 ...
- [No00008A]bat改变cmd命令提示符颜色
从Windows 95到现在的Windows 10,系统中带的DOS命令提示符软件都是黑白画面,下面教大家几个自定义DOS命令提示符颜色的小技巧. 改变DOS命令提示符的标题:在开始菜单点运行,输入 ...
- iOS CALayer应用详解(2)
参考博客:http://blog.csdn.net/hello_hwc?viewmode=list 如果你对CALayer 还没有一个清晰的理解,欢迎看一下前面的博客: http://www.cnbl ...
- javascript中的自执行函数
学习es6的时候遇到了自执行函数,感觉有必要写下来,一方面加深自己的记忆,另一方面还能分享给大家. 什么是自执行函数? 自执行函数就是为了不污染全局变量命名空间的一中匿名函数,相当于自己创建了一个作用 ...
- FineUI(专业版)v3.1发布(ASP.NET控件库)!
FineUI(专业版)v3.1 正式发布,60多项更新,官网示例多达 690 个,新增 30 个页面加载动画! 自 2008 年 4 月发布第一个版本,我们持续更新了 126 个版本,拥有 16000 ...
- sql server多重行列转置的优化
将表1转化成表2: 表1 表2 得到表2的结果,需要经过多次pivot转换,再经union连接到一起,代码如下: ] from ( select 'a' as type, * from Table_1 ...
- 关于delphi exit 继承
父类窗体frm 继承下来一个子类 form2 父类按钮代码 procedure Tfrm.Button1Click(Sender: TObject); begin ShowMessage('); Ex ...
- Linux and symmetric multiprocessing
没空看,暂时留着 http://www.ibm.com/developerworks/library/l-linux-smp/
- Sublime Text 配置代码
{ "font_face": "Courier New bold", "font_size": 15.0, "ignored_wo ...