Funkcijos len () kaina

Kokios yra „ len() „Python“ įterptųjų modulių) išlaidos? (Sąrašas / „Tuple“ / linija / žodynas)

156
12 июля '09 в 7:31 2009-07-12 07:31 „Imran“ yra nustatytas liepos 12 d., 09:31, 2009-07-12 07:31
@ 4 atsakymai

Tai O (1) (pastovus laikas, nepriklausomai nuo faktinio elemento ilgio - labai greitai) kiekvienam minėtam tipui, plius set ir kiti, pvz., array.array .

180
12 июля '09 в 7:40 2009-07-12 07:40 atsakymą pateikė Alex Martelli liepos 12 d. 07:40 2009-07-12 07:40

Skambinimas „len“ () šiems duomenų tipams yra „O“ (1) „ CPython“ , labiausiai paplitęs „Python“ kalbos įgyvendinimas. Čia yra nuoroda į lentelę, kurioje pateikiamas daugelio įvairių CPython funkcijų algoritminis sudėtingumas:

TimeComplexity Wiki puslapis

113
12 июля '09 в 7:59 2009-07-12 07:59 Atsakymą davė Jamesas Thompsonas , liepos 12 d., 09:59, 2009-07-12 07:59

Šie matavimai rodo, kad „ len() O) (1) dažnai naudojama duomenų struktūroms.

Pastaba dėl timeit : kai naudojamas „flag“, o dvi linijos yra perduodamos į timeit , pirmoji eilutė vykdoma tik vieną kartą ir nėra sinchronizuojama.

Sąrašas:

 $ python -m timeit -s "l = range(10);" "len(l)" 10000000 loops, best of 3: 0.0677 usec per loop $ python -m timeit -s "l = range(1000000);" "len(l)" 10000000 loops, best of 3: 0.0688 usec per loop 

Tuple:

 $ python -m timeit -s "t = (1,)*10;" "len(t)" 10000000 loops, best of 3: 0.0712 usec per loop $ python -m timeit -s "t = (1,)*1000000;" "len(t)" 10000000 loops, best of 3: 0.0699 usec per loop 

String

 $ python -m timeit -s "s = '1'*10;" "len(s)" 10000000 loops, best of 3: 0.0713 usec per loop $ python -m timeit -s "s = '1'*1000000;" "len(s)" 10000000 loops, best of 3: 0.0686 usec per loop 

Žodynas (žodyno supratimas yra 2.7 + versijoje):

 $ python -mtimeit -s"d = {i:j for i,j in enumerate(range(10))};" "len(d)" 10000000 loops, best of 3: 0.0711 usec per loop $ python -mtimeit -s"d = {i:j for i,j in enumerate(range(1000000))};" "len(d)" 10000000 loops, best of 3: 0.0727 usec per loop 

Array:

 $ python -mtimeit -s"import array;a=array.array('i',range(10));" "len(a)" 10000000 loops, best of 3: 0.0682 usec per loop $ python -mtimeit -s"import array;a=array.array('i',range(1000000));" "len(a)" 10000000 loops, best of 3: 0.0753 usec per loop 

Įdiegti (įdiegti įdiegti į 2.7 +):

 $ python -mtimeit -s"s = {i for i in range(10)};" "len(s)" 10000000 loops, best of 3: 0.0754 usec per loop $ python -mtimeit -s"s = {i for i in range(1000000)};" "len(s)" 10000000 loops, best of 3: 0.0713 usec per loop 

Deque:

 $ python -mtimeit -s"from collections import deque;d=deque(range(10));" "len(d)" 100000000 loops, best of 3: 0.0163 usec per loop $ python -mtimeit -s"from collections import deque;d=deque(range(1000000));" "len(d)" 100000000 loops, best of 3: 0.0163 usec per loop 
48
12 июля '09 в 8:34 2009-07-12 08:34 atsakymą pateikė „ bernie “ liepos 12 d., 08:34, 2009-07-12 08:34

Visi šie objektai seka jų ilgį. Laikas ištraukti ilgį yra mažas (O (1) didelėje O pastaboje) ir iš esmės susideda iš [grubaus aprašymo, parašyto „Python“ terminais, o ne „C“ terminais): ieškokite žodyno „len“ ir išsiųskite jį į pastatytą ieškokite objekto __len__ metodo ir skambinkite ... viskas, ką reikia padaryti, yra return self.length

39
12 июля '09 в 9:17 2009-07-12 09:17 atsakymą pateikė john machin liepos 12 d., 09:17, 2009-07-12 09:17

Kiti klausimai apie „ žymi žymenis arba užduoti klausimą