Python:提高循环列表的速度

时间:2016-05-20 23:26:59

标签: python list

我有几个大型名单,每个大小约10,000个。

E.g。我的列表看起来如下,但我的真实生活列表在L1,L2,L3中各有大约10,000个元素:

L1 = ['A1','B1','A1','B1','A1','C1']
L2 = ['C1','C2','C3','C1','C2','C1']
L3 = [   1,   2,   3,   1,   2, 2]

这些列表是一对一的映射。

我需要根据L1,L2,L3中的元素组合创建一个新列表。

我尝试创建的新列表包含以下代码:

TypeDefn = ['Type1' if (x == 'A1' and y>=1 and y<=3)
              else 'Type1' if (z == 'C1' and y>=1 and y<=3)
              else 'Type2' if ( x== 'A2' and y>=0 and y<7)
              else 'Type3' for x in L1 for y in L3 for z in L2]

显然,我的案例代码必须迭代10,000 ^ 3次,这不是最佳解决方案。

出路是什么?

编辑: 为什么当难以回答问题时,人们只是低估了它。 Downvote应该受到评论,因为我真的错过了对这个问题的支持。并非这个世界上的所有问题都有确定性的解决方案。

@Sniggerfardimungus评论一定不能解决我的问题,但它给了我洞察力。

1 个答案:

答案 0 :(得分:1)

TypeDefn = ['Type1' if (y>=1 and y<=3) and (x == 'A1' or z == 'C1') else
            'Type2' if (.........) else 'Type3' for x......]

你不会对你拥有的东西有太大的改进,虽然你的真正的性能问题不是循环的运行时 - 它将是内存问题。你必须处理所有10000 ^ 3种可能的组合,所以无论如何你都是O(n ^ 3)。没有任何算法可以改善这一点。

你可以自己保存的地方是在计算结果时将结果写入磁盘....并用单个位替换你的字符串('Type1'等)。 Python试图通过一遍又一遍地重复使用这些字符串来压缩你的存储空间,但你已经给它一个死刑判决它不可能有吸引力。尝试使用L1,L2和L3中的500个条目运行代码,然后:

import sys; print sys.getsizeof(small_version_of_data_storage_hell)

你会明白我的意思。对我而言,它超过千兆,我们谈论的是最终数据量的1/8000。如果您的计算机将存储1万亿个字符串引用,那么您在这里并没有充分利用它。 =]

执行此代码时最有可能发生的事情是它会暂停,你的机器会出现爬行,然后似乎冻结,然后python解释器会崩溃,如果你很幸运,它将是唯一的遭受命运的事情。

通过在生成内存时将所有内容保存到内存中,您将获得更好的缓存行为,并且您最终会看到它完成。当然,无论你打算如何处理结果列表,你都必须从你编写的文件中处理它,但是你没有选择。