Быстрое расширение переднего списка в python

Каков самый быстрый способ расширить переднюю часть массива в python? Допустим, у меня есть 2 массива: а и б. Я хочу сделать самый быстрый способ 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)')

время: ~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)')

время: ~1,5 с

тест 3:

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)')

время: ~0,4 с

Но я думаю, что это должно быть быстрее, потому что конкатенация списков должна выполняться как изменение нескольких базовых указателей. И следующий код является самым быстрым, но он меняет 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)')

время: ~0,13 с

Таким образом, теоретически должен быть способ увеличить время перед тестом "НЕПРАВИЛЬНО".

5
задан Wojciech Danilo 21 June 2012 в 09:03
поделиться