用Python生成测试数据

16 篇文章 0 订阅

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

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

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

一条数据长度随机,平均38个字节左右,总共生成370MB左右的数据文件,用时23分钟左右。

测试了哪个地方是性能瓶颈,发现用时最长是genRandomName函数,而且每条数据调用两次,第二长的是genRandomDay。

genRandomName 用时是 genRandomDay 的 7倍,genRandomDay 里也没什么可优化的,所以重点优化genRandomName。

在Python中尝试了几种方法:

1.先生成字符列表,再join,而不是用+。

2.用random.sample。

提高速度都不明显,小于10%。

后来发现不做字符串操作,速度也提高有限,random操作看来比较耗时间。

于是写了一个c语言dll,通过ctypes使用,提高速度明显,同样是一千五条,用时8.65分钟。

# 使用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
     
     

c_dll是用c实现的生成任意长度的随机字符串的函数,编译成dll,放到Python程序相同目录下调用。

#include 
      
      
       
       
#include 
       
       
        
        
#include 
        
        
         
         
#include 
         
         
          
          

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
          
          
         
         
        
        
       
       
      
      

后来,用c实现的randInt函数代替Python的,用时5.3分钟,相对原来23分钟,速度提高4.34倍。



  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值