用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生成随机数与 ...
随机推荐
- Spring 通知(Advice)和顾问(Advisor)
AOP ( Aspect Oriented Programming 面向切面编程) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...
- Unity中脚本的执行顺序总结(@WhiteTaken)
(Editor)以上是Unity官方文档中的截图,脚本在被挂载到物体上,会启用Editor的方法Reset. (Initialization)当执行脚本开始,初始化的过程中,依次执行的是Awake-& ...
- [原]导入OpenStreetMap海图数据,并在GeoServer上发布
转载请注明作者think8848和出处(http://think8848.cnblogs.com) 上回我们说到如何<在GeoServer中为OpenStreetMap数据设置OSM样式> ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- [LeetCode] Nth Highest Salary 第N高薪水
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...
- [LeetCode] Find Peak Element 求数组的局部峰值
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- 外网访问内网工具ngrok tunnel 使用总结
需求分析 在软件开发测试过程中,我们会经常遇到需要网站部署测试.给客户演示.APP开发的调试这样的需求.通常的做法是申请一个域名和空间,将网站放到外网上给客户演示. 这种方法确实可行不过会有两点不好, ...
- VS2010快捷键设置
1.进入工具----选项 对话框 2.选择 环境---->键盘 3. 在 [显示命令包含] 下面的对话框中输入"对齐"关键字,然后就会在这个编辑框下面一个文本窗口中显示关 ...
- 跨域请求——WebClient通过get和post请求api
AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求 string url = string.Format("htt ...
- Android开发之带你轻松集成友盟统计
友盟统计是什么呢?为什么要集成他呢? 当我们需要获取自己写的软件的装机量和用户使用信息时,这时我们可以集成友盟统计. 首先到友盟统计中注册账号什么的就不废话了,直接看创建项目: 在个人中心中的管理里面 ...