2009-05-12 4 views
10

Có cách nào để tổng hợp một danh sách các số nhanh hơn với một vòng lặp, có lẽ trong thư viện Python không? Hoặc là một cái gì đó thực sự chỉ đa luồng/xử lý vector có thể làm hiệu quả?Cách nhanh hơn để tổng hợp một danh sách các số hơn là với một vòng lặp for?

Chỉnh sửa: Chỉ cần làm rõ, nó có thể là danh sách bất kỳ số nào, chưa được phân loại, chỉ cần nhập từ người dùng.

+1

Bạn có thực sự có nghĩa là "nhanh hơn", hay bạn có nghĩa là "Pythonic"? Là tổng hợp một danh sách các số thực sự là nút cổ chai trong mã của bạn cần tối ưu hóa? –

Trả lời

32

Bạn có thể sử dụng tổng() để tính tổng các giá trị của một mảng.

a = [1,9,12] 
print sum(a) 
2

Nếu mỗi cụm từ trong danh sách đơn giản là tăng 1 hoặc nếu bạn có thể tìm mẫu trong chuỗi, bạn có thể tìm công thức để tính tổng n cụm từ. Ví dụ, tổng của series {1,2,3, ..., n} = n (n + 1)/2

Read more here

1

Vâng, tôi không biết nếu nó là nhanh hơn nhưng bạn có thể thử một phép tính nhỏ để làm cho nó một hoạt động. (N * (N + 1))/2 cung cấp cho bạn tổng của tất cả các số từ 1 đến N và có các công thức khác để giải các khoản phức tạp hơn.

0

Đối với một danh sách chung, bạn phải ít nhất đi qua mọi thành viên ít nhất một lần để có được tổng, đó là chính xác những gì một vòng lặp for. Sử dụng các API thư viện (như tổng hợp) thuận tiện hơn, nhưng tôi nghi ngờ nó sẽ thực sự nhanh hơn.

+0

tổng() sẽ nhanh hơn vòng lặp vì nó được viết bằng C. –

+0

@musicfreak: không chính xác, nó sẽ nhanh hơn vì nó tránh được phí trên vòng lặp (biến đổi và gọi phương thức) – Algorias

+0

Đó là vì nó viết bằng C ... Dù bằng cách nào thì nó cũng nhanh hơn. –

5

Tuy nhiên, một cách khác để tổng hợp một danh sách với thời gian vòng lặp:

s = reduce(lambda x, y: x + y, l) 
+9

Bạn nên sử dụng toán tử operator.add thay cho lambda. Tổng hợp 100000 số đầu tiên là 34ms với lambda nhưng chỉ 19ms với toán tử.add. (Sum là tốt hơn so với cả hai lúc 15ms). – Kiv