猿问

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

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

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


>>> lis=[['a','b','c'],['d','e','f']]

>>> 'd' in (y for x in lis for y in x)

True

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


>>> lis = [['a','b','c'],['d','e','f']]

>>> 'd' in [j for i in mylist for j in i]

True

但是当我做这些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 in x]"

    100000 loops, best of 3: 1.51 usec per loop

然后我增加了列表的大小,并再次计时:


lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]

这次搜索'd'生成器比LC快,但是当我搜索中间元素(11)和最后一个元素然后LC再次击败生成器表达式时,我无法理解为什么?


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "'d' in (y for x in lis for y in x)"

    100000 loops, best of 3: 2.96 usec per loop


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "'d' in [y for x in lis for y in x]"

    100000 loops, best of 3: 7.4 usec per loop


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "11 in [y for x in lis for y in x]"

100000 loops, best of 3: 5.61 usec per loop


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "11 in (y for x in lis for y in x)"

100000 loops, best of 3: 9.76 usec per loop


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "18 in (y for x in lis for y in x)"

100000 loops, best of 3: 8.94 usec per loop


~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "18 in [y for x in lis for y in x]"

100000 loops, best of 3: 7.13 usec per loop


ibeautiful
浏览 374回答 3
3回答
随时随地看视频慕课网APP

相关分类

Python
我要回答