Как ускорить время обработки функции, которая находит комбинации? - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над этой проблемой, где мне нужно найти все комбинации покупаемых предметов в файле .csv, которые равны общей сумме. Покупка предметов может быть как положительной, так и отрицательной. Когда я запускаю свой код с тренировочными данными, я могу получить правильный ответ, но когда я использую реальные данные, у которых есть сотни покупок, он работает вечно. Мне интересно, как ускорить время обработки следующего кода.

import decimal
import pandas
import datetime

df = pandas.read_csv('negative_test.csv')
print(df)

# Index are the keys of the dictonary
index_list = list(df.index)

# Values are the values of the dictonary
values = df["Purchase"].to_list()
target = df["Target"].to_list()[0]
print(target)

def sanitize_values(list1):
    sanitized_list = []
    for item in list1:
        sanitized_list.append(float(item.replace(",","")))
    return sanitized_list

def merge(list1, list2):

    merged_list = [(list1[i], list2[i]) for i in range(0, len(list1))]
    return merged_list

merged_tuples = merge(index_list,sanitize_values(values))

def sum_tuples(tuples):
    s = 0
    for i in range(len(tuples)):
        s += tuples[i][1]
        #s += round(tuples[i][1],2)

    return s

def subset_sum(numbers, target, partial=[], s=0, progress=0):
    if(len(partial) > 0):
        s += partial[len(partial)-1][1]
    #s = sum_tuples(partial)

    # check if the partial sum is equals to target
    if round(s,2) == round(target,2):
        print ((partial, target))

    if len(numbers) == 0:
        return

    for i in range(len(numbers)):
        #hacked in progress bar
        if(len(partial) == 0):
            progress += 1
            printDateTime()
            print("progress: " + str(progress))


        #print("Starting from: " + str(i) + " Numbers: " + str(numbers) + "\n len: " + str(len(partial)) + "partial: " + str(partial))
        n = numbers[i][1]
        #n = round(numbers[i][1],2)
        remaining = numbers[i+1:]
        # print(remaining)

        subset_sum(remaining, target, partial + [numbers[i]], s, progress)

def printDateTime():
    now = datetime.datetime.now()
    print ("Current date and time : ")
    print (now.strftime("%Y-%m-%d %H:%M:%S"))


if __name__ == "__main__":
    printDateTime()
    subset_sum(merged_tuples,target)
    printDateTime()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...