【发布时间】:2016-11-10 20:28:52
【问题描述】:
我有以下 Python 2.7 代码:
listOfLists = []
for l1_index, l1 in enumerate(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
listOfLists.append(list)
L1,L2,L3,L4,L5 列表为:
L1 = [[0.60, 0.95, 0.38, 1.02, 0.29, 0.43], [0.40, 0.09, 0.87, 0.85, 0.70, 0.46], [0.67, 0.91, 0.66, 0.79, 0.86, 0.06], [0.59, 1.81, 0.05, 1.88, 0.20, 0.48], [0.64, 0.34, 0.37, 1.39, 0.56, 0.27], [0.56, 0.34, 0.68, 2.79, 0.18, 0.42], [0.42, 1.67, 0.04, 0.44, 0.25, 0.94], [0.32, 1.92, 0.95, 2.85, 0.95, 0.96], [0.50, 0.68, 0.84, 1.79, 0.35, 0.09], [0.34, 0.66, 0.85, 0.35, 0.38, 0.59], [0.50, 0.79, 0.45, 2.93, 0.50, 0.92], [0.11, 0.11, 0.93, 1.11, 0.81, 0.49]] # a list of 12 sublists
L2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
L3 = [480, 120, 35, 0, 520, 300]
L4 = [120, 120, 120, 0, 300, 35, 35, 520, 300, 480, 120, 480, 0, 35, 0, 0, 300]
L5 = [5.4, 2.83, 1.16, 6.9, 0.76, 2.15, 5.61, 3.12, 1.57, 0.08, 5.36, 0.2, 1.2, 1.4, 2.9, 2.1, 3.5]
这些只是示例;实际上,这些列表包含数十万个数字。解释器需要几十秒来计算三个嵌套的for 循环。
是否有可能以某种方式加速此代码,例如使用itertools 或任何其他模块/功能?
编辑:我不能使用非标准的 python 2.7 模块(numpy、scipy...)
【问题讨论】:
-
是更大数据结构的列表部分,那么 numpy 应该能够完成这项工作
-
@ChristianSauer 谢谢你的回复,我很抱歉没有提到我不能使用任何需要额外安装的python 2.7模块,比如numpy。
-
你能提供每个向量的长度吗?如果它们的长度相同,您可以使用
zip。您也可以使用列表推导,因为它太难读了。 -
您可以用 C/C++ 编写代码并将其导入 Python (docs.python.org/2/extending/extending.html) 吗?
-
由于我们不知道您列表中的数据意味着什么以及您尝试执行什么样的操作,因此甚至很难概念化一个答案。底线不是如何加速嵌套循环,是我什至需要嵌套循环来实现我想要的。换个说法-您需要找到更好的算法来执行您想要的操作(或者重新考虑使用的数据结构)。嵌套循环总是很麻烦,因为如果列表大小大致相同
n并且存在m嵌套循环,它实际上会产生类似O(n^m)的问题。切换到编译语言不会改变复杂性。