2012-09-13 30 views
5

Tôi tự hỏi liệu có bất kỳ lý do chính đáng nào để thích một danh sách trên một bộ tuple hoặc ngược lại trong python if statments. Vì vậy, sau đây là chức năng tương đương nhưng là một trong những ưu tiên khác về hiệu suất và phong cách mã hóa hay không nó không quan trọng?Sử dụng danh sách và bộ dữ liệu bằng Python nếu các câu lệnh

if x in (1,2,3): 
    foo() 

if x in [1,2,3]: 
    foo() 

tôi dường như đã nhận được vào các thói quen của việc sử dụng các bộ nếu có 2 hoặc 3 giá trị và danh sách cho bất cứ điều gì nữa, tôi nghĩ rằng bởi vì trong kinh nghiệm của tôi tuples có xu hướng ngắn hạn và dài danh sách, nhưng điều này dường như là một bit tùy ý và có lẽ không cần thiết không nhất quán.

Tôi muốn được quan tâm đến bất kỳ ví dụ nào mà mọi người có thể đưa ra về nơi mọi người sẽ tốt hơn người khác.

Chúc mừng

+3

thiết lập là thích hợp hơn cho cả hai ở đây – GP89

+0

Khả năng có thể có của [sự khác biệt giữa danh sách và bộ dữ liệu] (http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python) hoặc [danh sách python so với tuple khi sử dụng mỗi] (http://stackoverflow.com/questions/1708510/python-list -vs-tuple-khi-to-use-each). – DSM

+0

@ GP89: Chăm sóc để xây dựng? – voithos

Trả lời

5

Các khởi động của một tuple (ít nhất là trong CPython) sản xuất ít bytecode hơn list - nhưng thực sự không có gì phải lo lắng. Tôi tin rằng thử nghiệm thành viên là khá nhiều như nhau (mặc dù không được thử nghiệm nó).

Để kiểm tra thành viên hoàn toàn, ngữ nghĩa tra cứu giống nhau. Từ Python 2.7 trở đi, nó đẹp hơn nhiều để viết (và thêm một ngụ ý rằng nó chỉ là thử nghiệm thành viên):

if x in {1, 2, 3}: 
    pass # do something 

Trong khi trước đó:

if x in set([1,2,3]): 
    pass # do something 

chỉ nhìn một chút kludgy ...

+0

Cảm ơn bạn đã giải thích. Thành thật mà nói, tôi đã không nhận ra bạn có thể tạo ra một tập hợp bằng cách sử dụng '{}' trong 2,7, như bạn nói ý nghĩa của việc kiểm tra thành viên với một tập hợp là thỏa mãn hơn nhiều! – redrah

+1

Tôi đã làm một số timings và thấy rằng thử nghiệm cho các thành viên trong một chữ được thiết lập là * chậm hơn * so với thử nghiệm cho các thành viên trong một tuple chữ.Điều này có thể là do thời gian cần thiết để tạo bộ này. Chữ được đặt càng dài thì hiệu suất càng trở nên tồi tệ hơn, ngay cả khi các mục được thử nghiệm không phải là thành viên của tập hợp. Việc mua sắm là nếu bạn định tạo một bộ để thử nghiệm thành viên chỉ một lần, bạn nên sử dụng một bộ tuple. Nếu bạn cần kiểm tra nhiều lần, thì tập hợp được ưu tiên. –

+1

@StevenRumbalski, vui vì bạn đã thử nghiệm điều đó - tôi nghi ngờ nhiều. Điều quan trọng là, như Jon Clements đã nói ở trên, "Việc khởi tạo một tuple (ít nhất là trong CPython) tạo ra bytecode ít hơn một danh sách." Không chỉ mất nhiều thời gian để tạo ra một bộ dữ liệu hơn một bộ; đó là tuple được tạo ra chỉ một lần tại thời gian biên dịch và sau đó [folded] (http://en.wikipedia.org/wiki/Constant_folding) vào bytecode như một hằng số - điều có thể, tất nhiên, bởi vì bộ dữ liệu là không thay đổi . Tuy nhiên, có một biến chứng khác: nếu tuple chứa các giá trị có thể thay đổi, thì việc lặp lại hằng số _doesn't_ xảy ra. – senderle

0

Sự khác biệt giữa danh sách và bộ là danh sách có thể thay đổi và bộ dữ liệu không thay đổi.

dân có xu hướng sử dụng các bộ sưu tập cho heterogenous, tương tự như cấu trúc trong C, và danh sách được cho bộ sưu tập đồng nhất, tương tự như mảng trong C.

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