我正在回答这个问题,当我测试解决方案的时机时,发现与我认为正确的矛盾。
提出这个问题的人想找到一种方法来知道另一个列表中包含多少个不同的列表。(有关更多信息,您可以检查问题)
我的回答基本上是这个功能:
def how_many_different_lists(lists):
s = set(str(list_) for list_ in lists)
return len(s)
现在,情况出现了,当我测量运行时间并将其与基本相同的功能进行比较时,只是将列表而不是生成器作为参数传递给set():
def the_other_function(lists):
s = set([str(list_) for list_ in lists])
return len(s)
这是我用于测试功能的装饰器:
import time
def timer(func):
def func_decorated(*args):
start_time = time.clock()
result = func(*args)
print(time.clock() - start_time, "seconds")
return result
return func_decorated
这是给定输入的结果:
>>> list1 = [[1,2,3],[1,2,3],[1,2,2],[1,2,2]]
>>> how_many_different_lists(list1)
6.916326725558974e-05 seconds
2
>>> the_other_function(list1)
3.882067261429256e-05 seconds
2
即使是较大的列表:
# (52 elements)
>>> list2= [[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2],[1,2,3],[1,2,3],[1,2,2],[1,2,2]]
>>> how_many_different_lists(list2)
0.00023560132331112982 seconds
2
>>> the_other_function(list2)
0.00021329059177332965 seconds
2
现在,我的问题是:为什么第二个例子比第一个例子快?发电机不是因为生产“按需”元素而更快吗?我曾经认为制作列表并进行迭代比较慢。
PS:我测试了很多次,得到的结果基本相同。
我一直在对您的功能进行基准测试:
from simple_benchmark import BenchmarkBuilder
from random import choice
b = BenchmarkBuilder()
from operator import setitem
@b.add_function()
def how_many_different_lists(lists):
s = set(str(list_) for list_ in lists)
return len(s)
@b.add_function()
def the_other_function(lists):
s = set([str(list_) for list_ in lists])
return len(s)
@b.add_arguments('Number of lists in the list')
def argument_provider():
for exp in range(2, 18):
size = 2**exp
yield size, [list(range(choice(range(100)))) for _ in range(size)]
r = b.run()
r.plot()
生成器之所以懒惰,是因为与列表理解相比,生成器表达式将动态创建项目,而列表理解将在内存中创建整个列表。您可以在此处阅读更多内容:生成器表达式与列表理解
从基准中可以看出,它们之间没有太大差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句