快速python前端列表扩展

Woj*_*ilo 5 python performance profiling list concatenation

在python中扩展数组前端的最快方法是什么?假设我有2个数组:a和b.我想以a = b + a(b不应该改变)的最快方式.

我的小标记:

测试1:

a,b = [],[]
for i in range(0,100000):
    a.append(i)
    b.append(i)

def f(a,b):
    for i in range(0,100):
        a=a+b

import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)

时间:~12秒

测试2:

a,b = [],[]
for i in range(0,100000):
    a.append(i)
    b.append(i)

def f(a,b):
    for i in range(0,100):
        a[0:0] = b

import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)

时间:~1.5秒

TEST3:

a,b = [],[]
for i in range(0,100000):
    a.append(i)
    b.append(i)

lenb = len(b)
def f(a,b):
    for i in range(0,100):
        b.extend(a)
        # do something with b
        b = b[:lenb]

import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)

时间:~0.4s

但我认为它应该更快,因为列表连接应该作为几个底层指针的变化.以下代码是最快的代码,但更改b,而不是a(因为我们的目的不好):测试"错误":

a,b = [],[]
for i in range(0,100000):
    a.append(i)
    b.append(i)

def f(a,b):
    for i in range(0,100):
        b.extend(a)

import cProfile
cProfile.run('f(a,b)')
Run Code Online (Sandbox Code Playgroud)

时间:~0.13s

因此理论上应该有一种方法可以延长测试时间"WRONG"的时间.

lvc*_*lvc 10

绝对速度最快的方法是使用collections.deque它正是这种应用进行了优化,并已调用的方法.appendleft.extendleft使代码漂亮和可读- appendleft不正是它在锡说(即追加到双端队列的左侧) ,并且extendleft相当于:

def extendleft(self, other)
    for item in other:
        self.appendleft(c)
Run Code Online (Sandbox Code Playgroud)

所以,a = b+a拼写:

a.extendleft(reversed(b))
Run Code Online (Sandbox Code Playgroud)