Как я могу повысить эффективность при вставке большого количества ( 200) строк фрейма данных в модели Django?

#python #django #pandas #dataframe #django-models

Вопрос:

 for transaction in df.itertuples():
    transaction_obj = Transactions()
    transaction_obj.portfolio = strategy.portfolio
    transaction_obj.strategy = strategy
    transaction_obj.transaction_price = transaction.TransactionPrices
    transaction_obj.time_stamp = transaction[0]
    transaction_obj.transaction_type = name
    transaction_obj.brokerage = transaction.Brokerage

    if name == Transactions.LONG:
        if transaction.EntryLong:
            transaction_obj.action = Transactions.BUY
        if transaction.ExitLong:
            transaction_obj.action = Transactions.SELL
    elif name == Transactions.SHORT:
        if transaction.EntryShort:
            transaction_obj.action = Transactions.SELL
        if transaction.ExitShort:
            transaction_obj.action = Transactions.BUY

    transaction_obj.save()
 

Код отлично работает без проблем или ошибок, однако я хочу сократить время выполнения. В настоящее время для вставки 180 строк требуется около 7 секунд. Я использую базу данных PostgreSQL.

Ответ №1:

Если ваш сценарий предполагает всегда создавать записи (не изменять), то вы можете оптимизировать время создания с помощью массового создания:

 transactions = []
for transaction in df.itertuples():
    transaction_obj = Transactions()
    transaction_obj.portfolio = strategy.portfolio
    transaction_obj.strategy = strategy
    transaction_obj.transaction_price = transaction.TransactionPrices
    transaction_obj.time_stamp = transaction[0]
    transaction_obj.transaction_type = name
    transaction_obj.brokerage = transaction.Brokerage

    if name == Transactions.LONG:
        if transaction.EntryLong:
            transaction_obj.action = Transactions.BUY
        if transaction.ExitLong:
            transaction_obj.action = Transactions.SELL
    elif name == Transactions.SHORT:
        if transaction.EntryShort:
            transaction_obj.action = Transactions.SELL
        if transaction.ExitShort:
            transaction_obj.action = Transactions.BUY

    transactions.append(transaction_obj)
Transaction.objects.bulk_create(transactions)