我正在尝试使用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个小时。如何优化此循环以使其运行更快?
答案 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:请转到应用程序->活动监视器->内存(标签)