代码之家  ›  专栏  ›  技术社区  ›  PKKid

python:python list是保留len()的计数,还是对每个调用都计数?

  •  61
  • PKKid  · 技术社区  · 17 年前

    如果我一直在一个很长的列表中调用len(),我是在浪费时间,还是在后台保持int计数?

    7 回复  |  直到 10 年前
        1
  •  62
  •   Ferdinand Beyer    17 年前

    别担心:当然,它可以节省计数,因此 len() 在名单上是一个相当便宜的操作。顺便说一下,字符串、字典和集合也是如此!

        2
  •  26
  •   AKX Bryan Oakley    11 年前

    还有一个方法是 to look it up on Google Code Search look at the source on GitHub ,如果您不想自己下载源。

    static Py_ssize_t list_length(PyListObject *a)
    {
        return a->ob_size;
    }
    
        3
  •  21
  •   George V. Reilly    17 年前
        4
  •  9
  •   bignose    10 年前

    写你的程序,这样 为清晰和易于维护而优化 . 打电话给你的节目更清楚吗 len(foo) ?然后这样做。

    你担心所花费的时间吗?使用 timeit module in the standard library 测量 所用的时间,并查看它在代码中是否重要。

    像大多数人一样,您很可能在猜测程序的哪些部分最慢时出错。避免猜测的诱惑,而是通过测量来找出答案。

    记住 过早的乐观是万恶之源。 用唐纳德·克努斯的话说。只关注代码的速度 仔细斟酌的 速度,知道它是否值得改变它的工作方式的成本。

        5
  •  5
  •   dF.    17 年前

    问题已经回答了( len 是O(1)),但下面是您自己检查的方法:

    $ python -m timeit -s "l = range(10)" "len(l)"
    10000000 loops, best of 3: 0.119 usec per loop
    $ python -m timeit -s "l = range(1000000)" "len(l)"
    10000000 loops, best of 3: 0.131 usec per loop
    

    是的,不是很慢。

        6
  •  3
  •   Ken    17 年前

    python“list”实际上是一个可调整大小的数组,而不是一个链接列表,因此它将大小存储在某个地方。

        7
  •  0
  •   Georg Schölly Crazy Developer    17 年前

    它必须将长度存储在某个地方,所以您不必每次都计算项目的数量。