Я пытаюсь смоделировать наборы тестовых данных с помощью Python-Faker. Цель состоит в том, чтобы иметь несколько миллионов записей для моего варианта использования. Ниже приведен код, который я использую для заполнения 5 элементов данных для 1 миллиона записей.
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 часов. Как я могу оптимизировать этот цикл, чтобы он работал быстрее?






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
@ Нариман Да. Потому что вам нужны альтернативные самец и самка. Это просто репрезентативно.
Вы проверили, что у вас достаточно оперативной памяти и что ваша операционная система использует HD Space в качестве оперативной памяти?
Обмен / подкачка может снизить скорость любого работающего программного обеспечения (и всей ОС), поскольку код требует все больше и больше памяти, в то время как операционная система пытается использовать все больше и больше свободного места на жестком диске для выделения все больше и больше «виртуальной» оперативной памяти. место на жестком диске в конце концов / почти все место в вашей «физической» оперативной памяти было исчерпано ...
Запустите код и продолжайте следить за потреблением памяти кодом во время его выполнения.
Если вы используете Mac OS X: перейдите в Приложения -> Монитор активности -> Память (вкладка)
Я думаю дело не в памяти. Если вы видите код, добавление каждый раз к фрейму данных требует времени, и даже фейкер работает медленно.
Я не согласен с вами ... я просто хотел убедиться, что проблема с памятью не упущена из виду ... Может быть, мне следовало написать это в комментарии, а не в ответе!
Вы очень хорошо это объяснили. Если проблема с памятью, это поможет ему/сообществу. Оставьте как есть.
Спасибо за комментарии! Это определенно не память, как указал @Vishnudev, проблема заключается в добавлении каждой итерации.
Это работает отлично, одно небольшое исправление, мне нужно повторить это до «1000000» вместо «500000».