Pertama, perhatikan yang max()
menggunakan protokol iterator , sementara list.sort()
menggunakan kode ad-hoc . Jelas, menggunakan iterator adalah overhead yang penting, itulah mengapa Anda mengamati perbedaan waktu itu.
Namun, selain itu, pengujian Anda tidak adil. Anda menjalankan a.sort()
daftar yang sama lebih dari sekali. The algoritma yang digunakan oleh Python secara khusus dirancang untuk menjadi cepat untuk sudah (sebagian) diurutkan data. Pengujian Anda menunjukkan bahwa algoritme tersebut melakukan tugasnya dengan baik.
Ini adalah tes yang adil:
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'max(a[:])'
1000 loops, best of 3: 227 usec per loop
$ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a[:].sort()'
100 loops, best of 3: 2.28 msec per loop
Di sini saya membuat salinan daftar setiap saat. Seperti yang Anda lihat, urutan besarnya hasil berbeda: mikro vs milidetik, seperti yang kita perkirakan.
Dan ingat: big-Oh menentukan batas atas! Batas bawah untuk algoritma pengurutan Python adalah Ω ( n ). Menjadi O ( n log n ) tidak secara otomatis menyiratkan bahwa setiap proses membutuhkan waktu yang sebanding dengan n log n . Ini bahkan tidak menyiratkan bahwa itu harus lebih lambat dari algoritma O ( n ), tapi itu cerita lain. Yang penting untuk dipahami adalah bahwa dalam beberapa kasus yang menguntungkan, algoritme O ( n log n ) dapat berjalan dalam waktu O ( n ) atau kurang.