相关疑难解决方法(0)

列表理解与生成器表达式的奇怪时间结果?

我正在回答这个问题,我更喜欢这里的生成器表达并使用它,我认为它会更快,因为生成器不需要先创建整个列表:

>>> lis=[['a','b','c'],['d','e','f']]
>>> 'd' in (y for x in lis for y in x)
True
Run Code Online (Sandbox Code Playgroud)

Levon在他的解决方案中使用了列表理解,

>>> lis = [['a','b','c'],['d','e','f']]
>>> 'd' in [j for i in mylist for j in i]
True
Run Code Online (Sandbox Code Playgroud)

但是当我做这些LC的时间结果比生成器快时:

~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f']]" "'d' in (y for x in lis for y in x)"
    100000 loops, best of 3: 2.36 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f']]" "'d' in [y for x in lis for y …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension list generator-expression timeit

34
推荐指数
3
解决办法
4605
查看次数

列表是否理解为Python 3中的`list(generator expression)`的语法糖?

在Python 3中,列表理解只是语法糖,用于生成list函数的生成器表达式?

例如是以下代码:

squares = [x**2 for x in range(1000)]
Run Code Online (Sandbox Code Playgroud)

实际上在后台转换成以下内容?

squares = list(x**2 for x in range(1000))
Run Code Online (Sandbox Code Playgroud)

我知道输出是相同的,并且Python 3修复了列表推导所具有的周围命名空间的令人惊讶的副作用,但就CPython解释器所做的事情而言,前者转换为后者,或者是否有任何区别在如何执行代码?

背景

我发现,在评论部分等价的这一主张这个问题,和快速谷歌搜索显示了同样的要求正在作出这里.

在Python 3.0文档中的新内容中也提到了这一点,但措辞有些含糊:

还要注意,列表推导具有不同的语义:它们更接近于list()构造函数中的生成器表达式的语法糖,特别是循环控制变量不再泄漏到周围的范围中.

python list-comprehension generator-expression python-3.x python-internals

33
推荐指数
3
解决办法
2249
查看次数

与列表相比,在生成器上多次迭代的速度

我预计在多循环的情况下,列表迭代将比使用生成器快得多,我的代码表明这是错误的.

我的理解是(通过操作我的意思是任何定义元素的表达式):

  • 列表需要初始化n个操作
  • 但是然后列表上的每个循环只是从内存中获取一个元素
  • 因此,列表上的m循环只需要n次操作
  • 生成器不需要初始化任何操作
  • 然而,循环生成器在fly中运行操作
  • 因此,生成器上的一个循环需要n次操作
  • 但是m生成器上的循环需要nxm操作

我使用以下代码检查了我的期望:

from timeit import timeit

def pow2_list(n):
    """Return a list with powers of 2"""

    results = []

    for i in range(n):
        results.append(2**i)

    return results

def pow2_gen(n):
    """Generator of powers of 2"""

    for i in range(n):
        yield 2**i

def loop(iterator, n=1000):
    """Loop n times over iterable object"""

    for _ in range(n):
        for _ in iterator:
            pass

l = pow2_list(1000) # …
Run Code Online (Sandbox Code Playgroud)

python iteration performance list generator

4
推荐指数
1
解决办法
809
查看次数