如何在python中加速嵌套循环?

时间:2018-04-19 01:10:19

标签: python for-loop

我已经读过我们可以使用map函数来加速循环。但是,在我的代码中我有嵌套循环,我想知道是否有使用map函数或任何其他方法来加速我的代码。

import copy as cpy
import time

def powerset(s):
    set =[]
    x = len(s)
    for i in range(1 << x):
         set.append([s[j] for j in range(x) if (i & (1 << j))])
    return set

def func1(Num):

    Num_set = range(1, Num + 1)
    A = []
    for i in range(1, Num + 1):
        my_set = cpy.deepcopy(Num_set)
        my_set.remove(i)
        my_subset = list(powerset(my_set))

        for j in range(0, len(my_subset)):
            name = "{r}:{s}".format(r=i, s=list(my_subset[j]))
            A.append(name)
    return A

start = time.time()
N = 10
A = func1(N)
end = time.time()
print("Run time:{t}".format(t=end - start))

N = 10的上述代码的运行时间是:

Run time:0.0383169651031

但是N = 20的运行时间大约是两分钟:

Run time:101.803981066

有什么想法加速函数func1中的嵌套循环?

此代码执行的操作:考虑数字N = 3。函数func1首先创建一个列表Num_set = [1,2,3]。然后对于该列表的每个元素说i,它生成集合的所有非空子集(没有i的Num_set)。例如,如果i = 2,则将“2,[]”,“2,[1]”,“2,[3]”,“2,[1,3]”添加到列表A中。

非常感谢!

1 个答案:

答案 0 :(得分:1)

嗯,你至少可以改进那些可以的部分:

for i in range(1, Num + 1):
    my_set = cpy.deepcopy(Num_set)
    my_set.remove(i)
    my_subset = list(powerset(my_set))

    for j in range(0, len(my_subset)):
        name = "{r}:{s}".format(r=i, s=list(my_subset[j]))
        A.append(name)

这将删除不需要的复制:

for i in range(1, Num + 1):
    # copying and then removing one item is more costly than simply making the list
    my_set = range(1, i) + range(i + 1, Num + 1)

    for s in powerset(my_set):
        name = "{r}:{s}".format(r=i, s=s)
        A.append(name)