有效生成伪数据的Python方式

时间:2018-08-20 21:37:20

标签: multithreading python-2.7 pandas multiprocessing dummy-data

尝试在具有以下配置的盒子上生成十亿行随机数据,仅此盒子上正在运行数据创建。 仅查找有关可以使用哪些方法来提高性能的说明。

Running         : Python 2.7 
OS              : RHEL 7.5

processor       : 1 to 15
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
stepping        : 1
microcode       : 0xb00002a
cpu MHz         : 2300.268
cache size      : 46080 KB
physical id     : 0
siblings        : 16
core id         : 7
cpu cores       : 8

代码:

import random
from datetime import date
import csv
import collections
from multiprocessing import Process
from datetime import datetime as dt
from datetime import timedelta

recordCount = 100000
start_date="2017-01-01"
end_date="2017-03-31"

file1 = csv.writer(open('file1.csv', "wb"), quoting=csv.QUOTE_ALL)
file2 = csv.writer(open('file2.csv', "wb"), quoting=csv.QUOTE_ALL)
file3 = csv.writer(open('file3.csv', "wb"), quoting=csv.QUOTE_ALL)

weekend = set([5, 6])

for i in range(1, recordCount):
    for date in daterange(start_dt, end_dt):
        if date.weekday() not in weekend:
            for i in range(1, random.randrange(5, 9)):          
                file1.writerow(rand_amt())
                file2.writerow(rand_amt())
                file3.writerow(rand_amt())

def rand_amt():
    amt_1 = random.randrange(0, 10000)
    amt_2 = random.randrange(0, 10000)
    amt_3 = random.randrange(0, 1000)
    amt_4 = random.randrange(0, 100)

    return amt_1, amt_2, amt_3, amt_4

def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)
  

INFO程序花费了--44906.657975秒---

上面的代码需要大约13个小时的四分之一,我认为这是由于嵌套的迭代。

**我尝试了**

  
      
  1. 创建列表并追加到列表中,而不是为每个记录编写。某些迭代完成后再写,但是我在这里没有看到很多改进。运行1000条记录后,我看到了1秒的改进。
  2.   
  3. 尝试过多线程/多处理,看来我并不完全了解它们之间的区别。仍在尝试。
  4.   
  5. 试图将它们分成几个月/季度,但是要花太多的精力来跟踪过程和连接文件。
  6.   

使用Python处理此类问题的最佳方法是什么?有没有办法提高性能?

还是应该在其他地方寻找?

要求是每天生成1000万个维记录,并且每个维记录在事实表中应具有5-8个记录。理想情况下,一次迭代中必须有3个事实,每个5-8 Rec,并且它们应该具有随机值。

0 个答案:

没有答案