我正在回答这个问题,我更喜欢这里的生成器表达并使用它,我认为它会更快,因为生成器不需要先创建整个列表:
>>> 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 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
我预计在多循环的情况下,列表迭代将比使用生成器快得多,我的代码表明这是错误的.
我的理解是(通过操作我的意思是任何定义元素的表达式):
我使用以下代码检查了我的期望:
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)