2012-02-23 32 views
6

Nhanh câu hỏi, đó là hiệu quả hơn cho việc tìm kiếm số nhỏ nhất (float) trong một danh sách dài (Trên 10000 phần tử)cách efficent nhất của việc tìm kiếm các phao tối thiểu trong một danh sách python

là nó

min(mylist) 

hoặc

mylist.sort() 

và sau đó trở

mylist[0] 

hoặc cái gì khác ...

cảm ơn!

+4

Tôi sẽ có một đâm rằng 'min' sẽ không chỉ có ngữ nghĩa chính xác hơn, nhưng có khả năng sẽ được triển khai hiệu quả hơn vì Python sẽ biết phải làm gì, và' sort() 'có thể không phải là điều tốt nhất làm. –

+0

Ngoài ra, hãy xem http://stackoverflow.com/questions/2289053/fast-way-to-get-n-min-or-max-elements-from-a-list-in-python cho một bản sao –

+1

Đã được 'thời gian 'bị hỏng? Điều này có vẻ như một cơ hội tuyệt vời để hiển thị kết quả từ 'timeit'. Tại sao bạn không đăng kết quả 'timeit'? –

Trả lời

10

Nếu danh sách đã được điền, min() là cách hiệu quả nhất.

Có một số thủ thuật bạn có thể sử dụng trong các tình huống đặc biệt:

  • Nếu bạn xây dựng danh sách từ đầu, bạn chỉ cần giữ cho mục nhỏ nhất được nêu ra trong một biến bên ngoài, do đó câu trả lời sẽ được đưa ra trong O(1).
  • Nếu chỉ có phao trong danh sách, hãy sử dụng Array mang lại hiệu suất tốt hơn.
  • Bạn có thể giữ danh sách được sắp xếp bằng cách sử dụng bisect.
  • Sử dụng Python Heap, thậm chí có hiệu quả thực hiện min(). Hãy chắc chắn rằng bạn hiểu các hiệu ứng, chủ yếu là một chèn chậm hơn. (credit: interjay)
+1

cảm ơn mọi người trả lời - rất hữu ích. Trên phản ánh tôi đã nhận ra tôi không cần phải actaually giữ tất cả các giá trị treo xung quanh để làm việc tìm kiếm cuối cùng cho thấp nhất. Tất cả tôi cần là để so sánh giá trị hiện tại trong vòng lặp với min và làm một chút 'nếu một user1228368

+1

@ user1228368: Bạn nên [chấp nhận câu trả lời này] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) - nhấp vào dấu kiểm ở bên trái. – DSM

+0

được ghi nhận hợp lệ! cảm ơn! – user1228368

2

Vâng, bạn chắc chắn phải lặp qua toàn bộ danh sách, vì vậy thời gian chạy của bạn phải là O (n).

Như sắp xếp đã mất thời gian O (n log n), điều này rõ ràng không phải là cách tốt nhất để làm điều này. Tôi không biết việc thực hiện min(), nhưng nó phải là cách đúng để làm điều này.

11

Frst, nếu bạn quan tâm về hiệu suất trong Python (mà không phải lúc nào cũng là một điều hợp lý để quan tâm, nhưng đó là chuyện khác), bạn nên sử dụng các timeit module. Ngay cả trong C thật khó để dự đoán một số chức năng sẽ hoạt động như thế nào sau khi biên dịch, và khó hơn trong Python. Mọi người thường tự tin thể hiện ý kiến ​​về những chức năng nào nhanh hơn phụ thuộc vào dữ liệu. Sau đó - bằng cách sử dụng timeit, ý tôi là - bạn có thể tự mình phát hiện ra.

Thứ hai, nếu bạn thực sự quan tâm đến hiệu suất trên danh sách phao, bạn không nên sử dụng danh sách nào cả, nhưng mảng có nhiều mảng. Sử dụng IPython tại đây, theo Python 2.7.2, giúp việc định thời dễ dàng:

In [41]: import random, numpy 
In [42]: a = [0.1*i for i in range(10**5)] 
In [43]: timeit min(a) 
100 loops, best of 3: 4.55 ms per loop 
In [44]: timeit sorted(a)[0] 
100 loops, best of 3: 4.57 ms per loop 
In [45]: random.shuffle(a) 
In [46]: timeit min(a) 
100 loops, best of 3: 6.06 ms per loop 
In [47]: timeit min(a) # to make sure it wasn't a fluke 
100 loops, best of 3: 6.07 ms per loop 
In [48]: timeit sorted(a)[0] 
10 loops, best of 3: 65.9 ms per loop 
In [49]: b = numpy.array(a) 
In [50]: timeit b.min() 
10000 loops, best of 3: 97.5 us per loop 

Và chúng tôi lưu ý một vài điều. (1) Sắp xếp của Python (timsort) hoạt động rất tốt trên dữ liệu đã sắp xếp chạy, do đó việc sắp xếp danh sách đã sắp xếp gần như không bị phạt. (2) Việc sắp xếp một danh sách ngẫu nhiên, mặt khác, chậm hơn rất nhiều, và điều này sẽ chỉ trở nên tệ hơn khi dữ liệu lớn hơn. (3) Numpy.min() trên một mảng float hoạt động nhanh hơn sáu mươi lần so với min trong danh sách Python, vì nó không phải là chung.

+0

+1 Đó là câu trả lời hay nhất nếu nhà phát triển kiểm soát việc xây dựng danh sách (trái ngược với việc xử lý như đầu vào) –

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