我已经读过我们可以使用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中。
非常感谢!
答案 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)