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

Python list()与列表理解构建速度

隆宏爽
2023-03-14
问题内容

这很有趣; list()强制迭代器获取实际列表的速度比[x for x in someList](理解)快得多。

这是真实的还是我的测试太简单了?下面是代码:

import time

timer = time.clock()
for i in xrange(90):

    #localList = [x for x in xrange(1000000)]   #Very slow, took me 6.8s
    localList = list(xrange(1000000))           #Very fast, took me 0.9s

    print localList[999999] #make sure list is really evaluated.

print "Total time: ", time.clock() - timer

问题答案:

列表推导以Python字节码执行循环,就像常规for循环一样。

list()调用完全在C代码中进行迭代,这要快得多。

列表理解的字节码如下所示:

>>> import dis
>>> dis.dis(compile("[x for x in xrange(1000000)]", '<stdin>', 'exec'))
  1           0 BUILD_LIST               0
              3 LOAD_NAME                0 (xrange)
              6 LOAD_CONST               0 (1000000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                12 (to 28)
             16 STORE_NAME               1 (x)
             19 LOAD_NAME                1 (x)
             22 LIST_APPEND              2
             25 JUMP_ABSOLUTE           13
        >>   28 POP_TOP             
             29 LOAD_CONST               1 (None)
             32 RETURN_VALUE

>>指针大致给你执行循环的界限,让你有百万STORE_NAMELOAD_NAMELIST_APPEND步骤在Python字节码估价循环执行。

list()另一方面,仅xrange()使用C
API进行对象迭代即可直接从Iterable中获取值,并且它可以使用xrange()对象的长度来预分配列表对象,而不是动态地对其进行增长。



 类似资料:
  • 问题内容: 我喜欢Python列表理解语法。 它也可以用来创建字典吗?例如,通过遍历键和值对: 问题答案: 使用字典理解: 注意:这适用于Python 3.x(及2.7及更高版本)。以前在Python 2.6和更早版本中,dict内置函数可以接收可迭代的键/值对,因此您可以将其传递给列表理解或生成器表达式。例如: 在简单的情况下,您根本不需要理解… 但是,如果您已经具有可迭代的键和/或值,只需di

  • 问题内容: 我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。 我的代码如下所示: 但是后来我想,这样写会更好吗? 它更具可读性,并且如果需要性能,则可以取出以获得某些东西。 问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念,应该以另一种方式来做到这一点(例如,使用而不是)吗? 问题答案: 我发现列表理解比 清晰得多,但请使用任何你更容易理解

  • 问题内容: 我有两个清单如下 我想提取物项从当他们在: 如何将两个循环写为单行列表理解? 问题答案: 应该这样做:

  • 问题内容: 我在玩一些python循环。我对使用“ for”循环非常熟悉: 您还可以使用循环创建一个简单列表: 然后我最近在Stack上发现了一种不错的高效循环类型来构建一个列表(这种类型的循环有名称吗?我真的很想知道,以便可以对其进行更好地搜索): 好的,话虽如此,我想进一步讲解最后一种循环,我尝试使用相同的逻辑类型构建python字典: 而不是使用: 我在等号上收到一条错误消息,告诉我这是无效

  • 问题内容: 什么时候应该使用生成器表达式,什么时候应该在中使用列表推导? 问题答案: John的答案很好(当你要迭代多次时,列表理解会更好)。但是,还应注意,如果要使用任何列表方法,都应使用列表。例如,以下代码将不起作用: 基本上,如果你要做的只是迭代一次,则使用生成器表达式。如果你要存储和使用生成的结果,那么列表理解可能会更好。 由于性能是选择彼此的最常见原因,所以我的建议是不要担心它,而只选择

  • 我使用的是Windows10i7第四代笔记本电脑,内存为8GB。 我想找出从1到100000000的数字之和可以被5整除。 我正在尝试在Raku REPL中运行此代码: 代码运行了45分钟,仍然没有输出。我该如何克服呢? 在这种情况下,如何应用并发呢?我认为以上问题可以通过并发或任务并行来解决!!