繁体   English   中英

Python代码片段需要很长时间才能运行..如何提高效率?

[英]Python code snippet is taking very long time to run.. how to increase efficiency?

任务是从列表(li)中选择元素,以便总和尽可能接近给定的数字(m)!。 但是, idk 方法需要很长时间才能运行:它永远不会完成。 当我编译代码时,该方法只是继续运行和运行。

from itertools import combinations, permutations

def idk(typeOfSlices, maxNoOfPizzaSlices):
    length = len(typeOfSlices) + 1
    listToReturn = []
    temporarySum = 0

    for r in range(length):

        pool = tuple(typeOfSlices)
        n = len(pool)
        for indices in permutations(range(n), r):
            if sorted(indices) == list(indices):
                le = tuple(pool[i] for i in indices)
                ts = sum(le)
                if(ts == maxNoOfPizzaSlices):
                    print(le, ":", sum(le))
                    return le

                if(ts > temporarySum and ts <= maxNoOfPizzaSlices):
                    temporarySum = ts
                    listToreturn = le

    print(le, ":", sum(le))
    return listToReturn

m = 4500
li = [7, 12, 12, 13, 14, 28, 29, 29, 30, 32, 32, 34, 41, 45, 46, 56, 61, 61, 62, 63, 65, 68, 76, 77, 77, 92, 93, 94, 97, 103, 113, 114, 114, 120, 135, 145, 145, 149, 156, 157, 160, 169, 172, 179, 184, 185, 189, 194, 195, 195,
]
idk(li, m)

我的 2 美分...

  • 代码片段是否适用于较小的数组大小? 如果它不适用于较小的列表,那么您可能有一个糟糕的算法。

  • 这可能是多线程的良好匹配。 您没有修改输入列表,因此不会有任何竞争条件。 像处理第一个 for 循环一样将列表切片,然后让每个线程处理排列。

  • 您对列表进行排序,然后在每次计算排列时查找重复值。 更糟糕的是,您甚至不保存排序列表。 我会创建一个专用的数据结构来存储中间结果,这样您就可以减少所需的排序和散列量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM