SORU
27 AĞUSTOS 2015, PERŞEMBE


Ayarlar ve liste konusunda len karmaşıklığı()

Ayarlar ve listeler ile ilgili olarak len() karmaşıklığı eşit olarak O(1) ' dir. Nasıl daha fazla zaman ayarlar işlem gerekir?

~$ python -m timeit "a=[1,2,3,4,5,6,7,8,9,10];len(a)"
10000000 loops, best of 3: 0.168 usec per loop
~$ python -m timeit "a={1,2,3,4,5,6,7,8,9,10};len(a)"
1000000 loops, best of 3: 0.375 usec per loop

Listeler daha setler inşa etmek için daha fazla zaman alır ve kriter dikkate de alır gibi belirli kriter, ilgisi var mı?

Eğer ayarlanmış bir nesne oluşturma bir listesini oluşturmak için karşılaştırıldığında daha uzun sürerse, altında yatan sebep ne olabilir?

CEVAP
27 AĞUSTOS 2015, PERŞEMBE


Öncelikleliste/set oluşturma hızını ölçtükten len(), hızını ölçtükten değilbirliktelen() hızı.

timeit --setup bağımsız değişken:

$ python -m timeit --setup "a=[1,2,3,4,5,6,7,8,9,10]" "len(a)"
10000000 loops, best of 3: 0.0369 usec per loop
$ python -m timeit --setup "a={1,2,3,4,5,6,7,8,9,10}" "len(a)"
10000000 loops, best of 3: 0.0372 usec per loop

--setup geçmesi ifadeleri len() hızını ölçmeden önce çalıştırın.

İkinci olarak,len(a) oldukça hızlı bir ifadesi olduğunu unutmayın. Hızı değiştirilebilir ölçüm işlemi,". gürültü the code executed (and measured) by timeit aşağıdaki eşdeğer olduğunu göz önünde bulundurun:

for i in itertools.repeat(None, number):
    len(a)

len(a) itertools.repeat(...).__next__() hem hızlı işlemleri ve hızları benzer olabilir, çünkü itertools.repeat(...).__next__() hızı zamanlamaları etkileyebilir.

Bu nedenle, döngü gövdesi yineleyici daha zaman çok daha yüksek bir miktar alır, böylece daha iyi len(a); len(a); ...; len(a) (100 kez tekrarlanır) ölçmek istiyorum:

$ python -m timeit --setup "a=[1,2,3,4,5,6,7,8,9,10]" "$(for i in {0..1000}; do echo "len(a)"; done)"
10000 loops, best of 3: 29.2 usec per loop
$ python -m timeit --setup "a={1,2,3,4,5,6,7,8,9,10}" "$(for i in {0..1000}; do echo "len(a)"; done)"
10000 loops, best of 3: 29.3 usec per loop

(Sonuçlar len() listeler ve ayarlar aynı performans var, hala diyor, ama şimdi sonuç doğru olduğundan emin olabilirsiniz.)

Üçüncü olarak,"karmaşıklık" ve "" ile ilgili, ama bir karışıklık. yapıyoruz sanırım hız doğrudur. len() olmasıO(1)listeler ve ayarlar için karmaşıklık listeler ve ayarlar konusunda da aynı hızla koşmak gerekir anlamına gelmez.

Ortalama olarak, ne kadar uzun listesi a len(a) hepsi birbirinin aynı asimptotik sayıda gerçekleştirir anlamına gelir. Ve hiçbir set b ne kadar, len(b) adım aynı asimptotik numarası yapar. Ama listeler ve ayarlar boyutunu hesaplama algoritması farklı, farklı performanslar bu durumda, ancak bu bir ihtimal olmadığını gösteriyor timeit () sonucu olabilir.

Son olarak

Eğer ayarlanmış bir nesne oluşturma bir listesini oluşturmak için karşılaştırıldığında daha uzun sürerse, altında yatan sebep ne olabilir?

Bir set bildiğiniz gibi elementleri tekrarlanan izin vermiyor. CPython setleri tablolar (ortalama sağlamak için . Özet olarak uygulanır ^em>O(1)ekleme ve arama): ve bir karma tablo yapımı bakımı listesine öğeler eklemek çok daha karmaşık.

Bir dizi oluştururken, özellikle karma değerlerini hesaplamak için, hash tablosu oluşturmak, yinelenen olayları ekleme önlemek için aramak ve böylece var. Buna karşılık, CPython listeler gerektiği gibi malloc()ed realloc()ed göstericiler, basit bir dizi olarak uygulanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jejoab

    Jejoab

    4 NİSAN 2008
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009