当前位置: 首页 > 面试题库 >

在python中创建列表的最佳和/或最快方法

胥康安
2023-03-14
问题内容

据我所知,在python中,至少有3到4种方法可以创建和初始化给定大小的列表:

简单循环append

my_list = []
for i in range(50):
    my_list.append(0)

简单循环+=

my_list = []
for i in range(50):
    my_list += [0]

清单理解:

my_list = [0 for i in range(50)]

列表和整数乘法:

my_list = [0] * 50

在这些示例中,考虑到列表仅包含50个元素,我认为不会有任何性能差异,但是如果我需要一百万个元素的列表怎么办?使用xrangemake会有所改善吗?在python中创建和初始化列表的首选/最快方法是哪种?


问题答案:

让我们使用进行一些时间测试*
timeit.timeit

>>> from timeit import timeit
>>>
>>> # Test 1
>>> test = """
... my_list = []
... for i in xrange(50):
...     my_list.append(0)
... """
>>> timeit(test)
22.384258893239178
>>>
>>> # Test 2
>>> test = """
... my_list = []
... for i in xrange(50):
...     my_list += [0]
... """
>>> timeit(test)
34.494779364416445
>>>
>>> # Test 3
>>> test = "my_list = [0 for i in xrange(50)]"
>>> timeit(test)
9.490926919482774
>>>
>>> # Test 4
>>> test = "my_list = [0] * 50"
>>> timeit(test)
1.5340533503559755
>>>

从上面可以看到,最后一种方法是迄今为止最快的。

但是,它 只能 与不可变项(例如整数)一起使用。这是因为它将创建一个引用相同项目的列表。

下面是一个演示:

>>> lst = [[]] * 3
>>> lst
[[], [], []]
>>> # The ids of the items in `lst` are the same
>>> id(lst[0])
28734408
>>> id(lst[1])
28734408
>>> id(lst[2])
28734408
>>>

这种行为通常是不希望的,并且可能导致代码中的错误。

如果您有可变项(例如列表),则应该使用仍然非常快的列表理解:

>>> lst = [[] for _ in xrange(3)]
>>> lst
[[], [], []]
>>> # The ids of the items in `lst` are different
>>> id(lst[0])
28796688
>>> id(lst[1])
28796648
>>> id(lst[2])
28736168
>>>

*注意:在所有测试中,我都替换rangexrange。由于后者返回迭代器,因此它应始终比前者更快。



 类似资料:
  • 问题内容: 所以我想知道如何最好地创建一个空白列表的列表: 由于Python如何处理内存中的列表,因此不起作用: 这确实会创建,但是每个元素都是相同的列表: 类似于列表理解的作品: 但这使用Python VM进行循环。有什么方法可以使用隐式循环(利用C语言编写的代码)吗? 这实际上要慢一些。:( 问题答案: 可能唯一的方法是比 是 它不必每次迭代都创建一个新对象,并且在我的计算机上快15%。 编辑

  • 问题内容: 当您执行类似列表在哪里的操作时,python会在列表上进行顺序搜索吗​​?还是创建哈希表表示来优化查找?在应用程序中,我需要这样做,因为我将在列表上进行很多查找,所以最好先执行诸如此类的操作,然后执行?还要注意,我将拥有的值列表将没有重复的数据,而且我实际上并不在乎它的顺序。我只需要能够检查值的存在。 问题答案: 还要注意,我将拥有的值列表将没有重复的数据,而且我实际上并不在乎它的顺序

  • 问题内容: 我有一百万行.txt格式的数据。格式很简单。对于每一行: 你知道我的意思。对于每个用户,它可能出现很多次,或者只出现一次(您永远不会知道)。我需要找出每个用户的所有值。因为用户可能会随机出现,所以我使用了Hashmap来做到这一点。即:HashMap(键:字符串,值:ArrayList)。但是要向arrayList添加数据,我必须不断使用HashMap get(key)来获取array

  • 问题内容: 我有以下格式的多维列表: 如何获得所有子列表的第三个值的最大值。用伪代码: 我知道这可以通过遍历列表并将第三个值提取到新列表中,然后简单地执行来完成,但是我想知道是否可以使用lambda或列表理解来完成? 问题答案: 只需与生成器表达式一起使用: 另外,不要命名您的变量,而是要隐藏类型。

  • 问题内容: 我的表(a,b,c,d)中有四列,它们全都依赖于列(日期),所以在查询中我有: 我需要知道为所有索引创建索引的最佳方法是什么,我有两个建议: 第一个建议: 第二个建议: 请使用哪个更好。 问题答案: 这可能对您有帮助: 要索引的列应该是用于过滤的列(子句)。您可以添加以避免查询。

  • 问题内容: 有没有比在Python中交换两个列表元素更快的方法了 还是我不得不求助于Cython或Weave之类? 问题答案: 看起来Python编译器使用此构造优化了临时元组: 码: 输出: 两个加载,一个和两个保存,而三个加载和三个保存。您不太可能找到更快的机制。