为数百万行优化python循环

时间:2019-06-03 14:47:20

标签: python optimization faker

我正在尝试使用Python-Faker模拟测试数据集。目标是为我的用例准备几百万条记录。以下是用于填充100万条记录的5个数据元素的代码。

for i in range(500000):
    df = df.append(
        {'COL1': fake.first_name_female(),
         'COL2': fake.last_name_female(),
         'COL3': 'F',
         'COL4': fake.street_address(),
         'COL5': fake.zipcode_in_state()
         }, ignore_index=True)
    df = df.append(
        {'COL1': fake.first_name_male(),
         'COL2': fake.last_name_male(),
         'COL3': 'M',
         'COL4': fake.street_address(),
         'COL5': fake.zipcode_in_state()
         }, ignore_index=True)

运行此程序花费了将近8个小时。如何优化此循环以使其运行更快?

2 个答案:

答案 0 :(得分:3)

import pandas as pd
from time import time
from faker import Faker
fake = Faker()

def fake_row(i):
    if i % 2 == 0:
        row = [fake.first_name_female(), fake.last_name_female(), 'F', fake.street_address(), fake.zipcode_in_state()]
    else:
        row = [fake.first_name_male(), fake.last_name_male(), 'M', fake.street_address(), fake.zipcode_in_state()]
    return row

start = time()
fake_data = [fake_row(i) for i in range(500000)]
df = pd.DataFrame(fake_data, columns=['COL1', 'COL2', 'COL3', 'COL4', 'COL5'])
print('[TIME]', time() - start)
[TIME] 171.82 secs

需要更快的代码吗?使用deco

import pandas as pd
from time import time
from faker import Faker
from deco import concurrent, synchronized
fake = Faker()

@concurrent
def fake_row(i):
    if i % 2 == 0:
        row = [fake.first_name_female(), fake.last_name_female(), 'F', fake.street_address(), fake.zipcode_in_state()]
        return row
    else:
        row = [fake.first_name_male(), fake.last_name_male(), 'M', fake.street_address(), fake.zipcode_in_state()]
        return row

@synchronized
def run(size):
    res = []
    for i in range(size):
        res.append(fake_row(i))
    return pd.DataFrame(res, columns=['COL1', 'COL2', 'COL3', 'COL4', 'COL5'])

start = time()
df = run(500000)
print('[TIME]', time() - start)
[TIME] 88.11 secs

答案 1 :(得分:0)

您是否检查了是否有足够的RAM,并且操作系统是否将HD Space用作RAM?

交换/分页可以降低任何正在运行的软件(和整个OS)的速度,因为代码需要越来越多的内存,而操作系统正试图使用​​越来越多的可用HD空间来分配越来越多的空间”在您的“物理” RAM上的所有/几乎所有空间都用完之后,HD上的虚拟“ RAM”空间就会出现。

运行代码,并在代码运行时继续监视代码的内存消耗。

如果您使用的是Mac OS X:请转到应用程序->活动监视器->内存(标签)