转载自:http://blog.csdn.net/caz28/article/details/45972109

有时我们需要大量的数据,一般编个程序生成一堆随机数据,Python很适合文本处理,干这个很方便。

下面程序生成一千万条数据,空格分开。

  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
# 生成数据库文件,用于测试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分钟。

  123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
# 使用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程序相同目录下调用。

  1234567891011121314151617181920212223242526
#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加上列名,那么导入向导就从第二行数据开始。其他则均不变。

转载于:https://www.cnblogs.com/AmilyWilly/p/6225088.html

用Python生成测试数据相关推荐

  1. python生成测试数据_Python基于Hypothesis测试库生成测试数据

    Hypothesis是Python的一个高级测试库.它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据.可以用更少的工作在代码中发现更多的bug. 安装 pip install hyp ...

  2. Python生成正则测试数据

    前言 匹配文本,最简单的方法就是使用正则表达式了. 但根据表达式生成测试数据,反过来一看,缺没什么头绪. 万幸的是,使用的是轮子遍地的python,所以只要找到相关模块就可以了. 正文 可使用xege ...

  3. python压力测试脚本_Python 脚本生成测试数据,随机数据,压力测试

    为了进行压力测试需要做几份大数据文件,根据表定义不同生成的文件的列数和类型也不同,分为 RandomName:随机长度的字符串最大长度通过参数指定 RandomIndex:打乱顺序的自增长序列 Ran ...

  4. 通过 Python_Faker 生成测试数据

    通过 Python_Faker 生成测试数据 一.介绍 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,你不可能通过手工来生成(最傻的方法)可能 ...

  5. 使用Hypothesis生成测试数据

    一.什么是Hypothesis Hypothesis 是python的一个高级测试库,它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试呼叫,可以用更少的工作在代码中发现更多的bug. 二 ...

  6. 使用OpenCV和Python生成视频条形码

    使用OpenCV和Python生成视频条形码 1. 效果图 2. 原理 2.1 步骤 2.2 项目结构 3. 源码 参考 这篇博客将演示如何使用Python + OpenCV生成视频条形码. 生成视频 ...

  7. python生成订单号或生成任意序列

    python生成订单号或生成任意序列 示例代码: import time# 生成订单号 def get_order_code():# 年月日时分秒+time.time()的后7位order_no = ...

  8. 独家 | 手把手教你怎样用Python生成漂亮且精辟的图像(附教程代码)

    作者:Fabian Bosler 翻译:车前子 校对:吴振东 本文约4800字,建议阅读15分钟. 本文将介绍如何利用Python生成图像并将结果做出可视化分析. 在上周的文章<用python从 ...

  9. Python生成随机五位数——模仿手机验证码

    使用Python生成随机的五位手机验证码. # -*- coding:utf-8 -*-#生成五位随机数,模仿手机验证码#导入random库,可以生成随机数 import randomdef ran( ...

最新文章

  1. php if require,php echo()和print()、require()和include()函数区别说明
  2. 中了logo1.exe
  3. AspNetPager 样式以及使用(漂亮)
  4. Android 即时通讯开发小结(二)
  5. 二值图像连通 C语言,二值图像统计连通区域C语言版
  6. 召回粗排精排-级联漏斗(下)
  7. C/C++入门的精髓!太全了吧,收藏夹的必备
  8. java sql in无效数字_java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字
  9. 业务人员自助BI分析不够用,还要自助数据准备?
  10. Flutter: 显示/关闭系统叠加层ui
  11. ASP.NET三层架构的优点和缺点
  12. 局域网文件共享手机访问电脑文件软件
  13. Excel如何判断数据是否重复
  14. mac windows linux 公用磁盘格式,win访问mac分区 linuxt系统磁盘分区知识(2)
  15. 小水智能-智能楼宇智慧建筑3D可视化系统,实现对实时数据的整合处理
  16. 解决 java 程序中 CPU 占用率过高问题
  17. 车载诊断系统-OBD
  18. 单核CPU与多核CPU的区别,多线程的优点,什么是并行?并发?
  19. 4298. 【NOIP2015模拟11.2晚】我的天
  20. Ubuntu Xfce桌面系统设置项

热门文章

  1. node.js 框架基本功能
  2. Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)
  3. 国科微电子:芯片将是国内企业下一个发力点
  4. 《树莓派实战秘籍》——1.20 技巧20使用Swap添加额外的内存
  5. JavaScript服务器端开发(函数实参对象arguments使用的几个注意事项)
  6. python常见错误解决路线图
  7. JQuery插件之弹窗:lhgDialog
  8. 开源 免费 java CMS - FreeCMS1.5-数据对象-guestbook
  9. js与java对json的操作
  10. !DOCTYPE html 到底是什么意思?