Berapa biaya len()
fungsi untuk built-in Python? (daftar / tuple / string / kamus)
290
Berapa biaya len()
fungsi untuk built-in Python? (daftar / tuple / string / kamus)
Ini O (1) (waktu konstan, tidak tergantung dari panjang sebenarnya elemen - sangat cepat) pada setiap jenis yang Anda sebutkan, plus set
dan lainnya seperti array.array
.
Memanggil len () pada tipe data tersebut adalah O (1) dalam CPython , implementasi paling umum dari bahasa Python. Berikut ini tautan ke tabel yang menyediakan kompleksitas algoritmik berbagai fungsi di CPython:
Halaman TimeComplexity Python Wiki
sumber
Semua benda itu melacak panjangnya sendiri. Waktu untuk mengekstrak panjangnya kecil (O (1) dalam notasi O besar) dan sebagian besar terdiri dari [deskripsi kasar, ditulis dalam istilah Python, bukan istilah C]: cari "len" dalam kamus dan kirim ke fungsi built_in len yang akan mencari
__len__
metode objek dan memanggil itu ... yang harus dilakukan adalahreturn self.length
sumber
length
muncul di kamus olehdir(list)
?list.lenght
Variabel yang diilustrasikan diimplementasikan dalam C, bukan Python.Pengukuran di bawah ini memberikan bukti yaitu
len()
O (1) untuk struktur data yang sering digunakan.Catatan tentang
timeit
: Ketika-s
bendera digunakan dan dua string dilewatkan ketimeit
string pertama dieksekusi hanya sekali dan tidak waktunya.Daftar:
Tuple:
Tali:
Kamus (kamus-pemahaman tersedia dalam 2.7+):
Himpunan:
Set (set-pemahaman tersedia dalam 2.7+):
Deque:
sumber
len()
, dan juga memperbaiki pengukuran untuk menggunakan-s
flag dengan benar.python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
223 nsec per looppython -m timeit -s "l = range(100);" "len(l)"
66.2 nsec per looplen adalah O (1) karena dalam RAM Anda, daftar disimpan sebagai tabel (serangkaian alamat yang berdekatan). Untuk mengetahui kapan tabel berhenti, komputer membutuhkan dua hal: panjang dan titik awal. Itu sebabnya len () adalah O (1), komputer menyimpan nilai, jadi hanya perlu mencarinya.
sumber
Saya telah memikirkan len () dalam Python tergantung pada ukuran daftar, jadi saya selalu menyimpan panjangnya dalam sebuah variabel jika saya menggunakan beberapa kali. Tapi hari ini ketika debugging, saya perhatikan atribut __len__ dalam objek daftar, jadi len () harus mengambilnya saja, yang membuat kompleksitas O (1). Jadi saya hanya googled jika seseorang sudah menanyakannya dan menemukan posting ini.
sumber
__len__
funtion, bukan variabel yang mewakili panjang daftar.list.__len__
fungsi berjalan dalam waktu yang konstan? Memang, tetapi bukan hanya karena itu adalah fungsi. Karena diimplementasikan seperti itu.