2012-06-21 55 views
5

Cách nhanh nhất để mở rộng mặt trước của mảng trong python là gì? Giả sử tôi có 2 mảng: a và b. Tôi muốn tạo ra cách nhanh nhất của a = b + a (b không nên thay đổi).Danh sách trước python nhanh mở rộng

benchamarks nhỏ của tôi:

thử nghiệm 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)') 

thời gian: ~ 12 s

thử nghiệm 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)') 

thời gian: ~ 1.5 giây

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

thời gian: ~ 0.4s

Nhưng tôi nghĩ rằng nó sẽ nhanh hơn, bởi vì danh sách nối nên được thực hiện như thay đổi vài gợi ý cơ bản. Và đoạn mã sau là nhanh nhất, nhưng thay đổi b, không phải là một (SO CNTT là không tốt cho MỤC ĐÍCH CỦA CHÚNG TÔI): test "sai":

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

thời gian: ~ 0.13s

Vì vậy, về mặt lý thuyết nên có một cách để mở rộng trước một thời gian thử nghiệm "WRONG".

+5

'từ bộ sưu tập im port deque' – eumiro

+1

Lưu ý, những gì bạn có là danh sách, không phải mảng. –

Trả lời

10

Cách nhanh nhất tuyệt đối sẽ được sử dụng một collections.deque được tối ưu hóa cho chính xác sử dụng này, và đã phương pháp gọi là .appendleft.extendleft để làm cho mã đẹp và dễ đọc - appendleft thực hiện chính xác những gì nó nói trên tin (ví dụ, nó gắn ở phía bên trái của deque), và extendleft không tương đương với:

def extendleft(self, other) 
    for item in other: 
     self.appendleft(c) 

vậy, a = b+a sẽ được đánh vần:

a.extendleft(reversed(b)) 
+0

Bạn muốn sử dụng 'a.extendleft (reversed (b))' vì 'extendleft' tiêu thụ vòng lặp đã cho từ đầu của nó (giống như con rắn đang ăn chuột). – eumiro

+0

@eumiro cảm ơn; Tôi đã sửa nó trong câu trả lời của mình. – lvc

Các vấn đề liên quan