Python列表切片效率

i_a*_*hon 9 python list slice

在以下代码中:

def listSum(alist):
    """Get sum of numbers in a list recursively."""
    sum = 0
    if len(alist) == 1:
        return alist[0]
    else:
        return alist[0] + listSum(alist[1:])
    return sum
Run Code Online (Sandbox Code Playgroud)

是每次我创建的新列表listSum(alist[1:])

如果是,这是推荐的方式还是我可以做更高效的事情?(不是针对特定的功能 - 这是一个例子 - 而是当我想要处理列表的特定部分时.)

编辑:

对不起,如果我困惑任何人,我对一个有效的sum实现不感兴趣,这作为一个例子,以这种方式使用切片.

小智 5

是的,它每次都会创建一个新列表.如果你可以使用iterable,你可以使用itertools.islice或玩杂耍iter(list)(如果你只需要在开始时跳过一些项目).但是当你需要确定参数是空的还是只有一个元素时,这会变得混乱 - 你必须使用try并捕获StopIteration.编辑:您还可以添加一个额外的参数来确定从哪里开始.与@ marcadian的版本不同,你应该把它作为默认参数,不要给调用者带来负担,并避免从外部传入错误索引的错误.

在这种情况下通常会更好 - 要么编写代码以便可以让for迭代处理(读取:不要像这样使用递归).或者,如果切片相当小(可能因为整个列表很小),无论如何咬住子弹和切片 - 它更容易,而切片是线性时间,常数因子非常小.

  • 因此,假设作为一个玩具示例,我有一个相当大的数字列表,并且我想将其中的 2 和一半相加。像“for number in mylist[middle:]: number+=2”这样的东西可以接受吗?(或者分割一个非常大的列表不被认为是一个好的做法?) (3认同)
  • @i_am_finally_learning_python 抛开那个例子不起作用 - 不改变`mylist`的内容(最简单的方法是不切片任何东西) - 这取决于。切片确实有一个很大的优点,它通常比替代方法更简单、更漂亮。但是根据“相当大”是什么,代码执行的频率以及其他因素,它可能会非常慢,并且可读性较差的无切片替代方案是值得的。一般很难说。 (2认同)