【问题标题】:Faster way to take two lists of integers and create pairs of type list获取两个整数列表并创建类型列表对的更快方法
【发布时间】:2019-05-03 02:42:50
【问题描述】:

关于如何将两个列表配对的问题已经被问到,但他们都将配对列表创建为tuples

假设我有两个列表,list1list2

list1 = [0,2,4,6,8]
list2 = [1,3,5,7,9]

将两者合并到一个元组列表中:

pairs = list(zip(list1, list2))
print(pairs)

输出:

>>> [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 

将列表类型从元组更改为列表:

listPairs = [list(pair) for pair in pairs]
print(listPairs)

输出:

[[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]] 

两者结合:

combined = [list(i) for i in list(zip(list1, list2))]

现在我的问题是:有没有更快的 Pythonic 方式来做到这一点?列表理解已经是 Pythonic 并且在相对非大的列表上相对较快,但是有更快的方法吗?或者这会是最快的方法吗?

我担心的是,当我在两个列表中使用这种方式时,每个列表的大小都超过 300k。

【问题讨论】:

  • 为什么不介绍这些方法?
  • 根据您的具体用例,延迟映射可能是合适的。
  • @DanielMesejo 个人资料的意思是提供一个具体的例子吗?一个场景?
  • 我的意思是你为什么不测量你提到的方法的速度。在衡量方法的效率之后,您最终会知道什么是最好的。
  • @DanielMesejo 好点,但如果我知道该怎么做,我就不会问了。我对将其应用于大型列表的一般情况感兴趣。

标签: python python-3.x list performance loops


【解决方案1】:

通常,只要您需要在一个时间点获得所有结果,列表推导式就会尽可能高效。在极端情况下,带有内置函数的map 将比列表理解更有效。有关详细信息,请参阅List comprehension vs map。所以你可以使用:

pairs = list(map(list, zip(list1, list2)))

这应该比:

pairs = [list(x) for x in zip(list1, list2)]

如果您需要超出这个边际改进的性能,我建议您使用 NumPy 等专业库:请参阅 What are the advantages of NumPy over regular Python lists?

【讨论】:

  • 我创建了两个包含 100 个项目的列表,并在 ipython 中使用%timeit 测试了这两个解决方案,并获得12.1 µs 的地图和17.7 µs 的列表你认为这很好吗?
  • @BearBrown,我对您的用例一无所知。是否可以接受取决于您的需求。对于如此小的列表,这些微小的差异可能是无关紧要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2020-08-05
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多