Я работаю над этой проблемой, где мне нужно найти все комбинации покупаемых предметов в файле .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()