为什么将列表作为参数传递比传递生成器要好?

Revliscano

我正在回答这个问题,当我测试解决方案的时机时,发现与我认为正确的矛盾。

提出这个问题的人想找到一种方法来知道另一个列表中包含多少个不同的列表。(有关更多信息,您可以检查问题

我的回答基本上是这个功能:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

zip生成器从元组列表传递参数

来自分类Dev

将列表作为参数传递

来自分类Dev

我可以将参数传递给ES6生成器函数吗

来自分类Dev

如何传递一个空的生成器参数?

来自分类Dev

传递生成器vs列表Python任意

来自分类Dev

为什么我的函数会覆盖作为参数传递的列表?

来自分类Dev

将正确或错误传递给yeoman生成器中的回调有什么作用?

来自分类Dev

将生成器表达式传递给all()

来自分类Dev

Python:如何将生成器传递给函数?

来自分类Dev

为什么生成器是详尽无遗的,而列表/元组不是?

来自分类常见问题

生成器作为函数参数

来自分类Dev

Python ::将列表作为参数传递

来自分类Dev

Ansible:将命令参数作为列表传递

来自分类Dev

Angular2:“ ...”的路由生成器未包含在传递的参数中

来自分类Dev

ASP.NET Core如何在服务生成器中传递参数

来自分类Dev

Angular2:“ ...”的路由生成器未包含在传递的参数中

来自分类Dev

将生成器映射到列表

来自分类Dev

为什么不能修改作为函数内部的参数传递的列表?

来自分类Dev

在将列表作为参数传递之前反转列表

来自分类Dev

列表通过将列表作为参数传递来删除范围

来自分类Dev

如何将Boost UUID随机生成器输出传递给主

来自分类Dev

如何将标准生成器传递给STL函数?

来自分类Dev

将file_name传递给Rails生成器模板

来自分类Dev

Android将R.String.xx值传递给字符串生成器

来自分类Dev

将Keras生成器传递给我的模型的__call__方法

来自分类Dev

将生成器表达式传递给 any() 和 all()

来自分类Dev

为什么我不能使用方法类作为生成器?

来自分类Dev

Javascript增强模块:在将模块作为参数传递时,为什么要向模块分配IIFE?

来自分类Dev

在OpenGL中,为什么glVertexAttribPointer要求将“指针”参数作为void *传递?

Related 相关文章

  1. 1

    zip生成器从元组列表传递参数

  2. 2

    将列表作为参数传递

  3. 3

    我可以将参数传递给ES6生成器函数吗

  4. 4

    如何传递一个空的生成器参数?

  5. 5

    传递生成器vs列表Python任意

  6. 6

    为什么我的函数会覆盖作为参数传递的列表?

  7. 7

    将正确或错误传递给yeoman生成器中的回调有什么作用?

  8. 8

    将生成器表达式传递给all()

  9. 9

    Python:如何将生成器传递给函数?

  10. 10

    为什么生成器是详尽无遗的,而列表/元组不是?

  11. 11

    生成器作为函数参数

  12. 12

    Python ::将列表作为参数传递

  13. 13

    Ansible:将命令参数作为列表传递

  14. 14

    Angular2:“ ...”的路由生成器未包含在传递的参数中

  15. 15

    ASP.NET Core如何在服务生成器中传递参数

  16. 16

    Angular2:“ ...”的路由生成器未包含在传递的参数中

  17. 17

    将生成器映射到列表

  18. 18

    为什么不能修改作为函数内部的参数传递的列表?

  19. 19

    在将列表作为参数传递之前反转列表

  20. 20

    列表通过将列表作为参数传递来删除范围

  21. 21

    如何将Boost UUID随机生成器输出传递给主

  22. 22

    如何将标准生成器传递给STL函数?

  23. 23

    将file_name传递给Rails生成器模板

  24. 24

    Android将R.String.xx值传递给字符串生成器

  25. 25

    将Keras生成器传递给我的模型的__call__方法

  26. 26

    将生成器表达式传递给 any() 和 all()

  27. 27

    为什么我不能使用方法类作为生成器?

  28. 28

    Javascript增强模块:在将模块作为参数传递时,为什么要向模块分配IIFE?

  29. 29

    在OpenGL中,为什么glVertexAttribPointer要求将“指针”参数作为void *传递?

热门标签

归档