@Rogalski是对的,你肯定需要重新考虑算法(至少尝试一下)。
但是如果你找不到更好的算法,我想你可以在使用嵌套循环的同时通过一些技巧来加快速度。注意,我将把L*列表当作一些全局变量,不需要传递给每个函数。因此,您需要保持这些列表对新函数可见,或者将它们作为参数添加。
首先,试着清理一下。例如,您似乎从未使用过l1_索引,因此可以将其删除。然后可以将第一个循环中发生的所有事情移到函数中。然后它将如下所示:listOfLists = []
for l1 in L1:
listOfLists.append(create_list(l1))
def create_list(l1):
list = []
for l2 in L2:
for l3_index,l3 in enumerate(L3):
if (L4[l2-1] == l3):
value = L5[l2-1] * l1[l3_index]
list.append(value)
break
return list
这很好,但是理解比用appends循环更快(here您可以找到一篇关于这个主题的好文章)。第一个循环非常简单,所以让我们将它折叠成listOfLists = [create_list(l1) for l1 in L1]。我们可以对create_list函数执行相同的内环提取list_of_lists = [create_list(l) for l in L1]
def create_list(l):
return [find_next(l, element) for element in L2]
def find_next(l, element):
for l3_index, l3_element in enumerate(L3):
if (L4[element - 1] == l3_element):
return L5[element - 1] * l[l3_index]
现在它看起来更有可读性,而且应该工作得更快一些。您也可以尝试使用内置的list函数在list(l3_index = l3.index(L4[element-1]),)中查找元素,但我不知道它是否会更快。
请注意,lambda不会比通常的函数更快地以相同的方式执行相同的操作。但它们会破坏堆栈跟踪,从而使代码更难调试。从itertools开始,您可以使用组合,但随后您将需要预生成列表,因为没有按顺序向您提供组合的合同。你不需要拉链。
代码的一个问题是在嵌套循环的每一轮中循环遍历L3。解决这个问题的办法是增加一些预计算。您需要知道L4的每个元素对应的索引L3。你可以这样做:# this will allow you to get index by element at a constant time
# and it only takes O(N)
L3_dict = {element:index for element,index in enumerate(L3)}
list_of_lists = [create_list(l) for l in L1]
def create_list(l):
return [find_next(l, element) for element in L2]
def find_next(l, element):
# if you use dict, you reduce time of this method from O(N) to constant
# as both access to dict item by key and to list item by index
# are done in a constant time
l3_index = L3_dict[L4[element-1]]
return L5[element-1] * l[l3_index]