🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27124

Re: B-drzewo w Pythonie

#27124
From: i0cus
Date: Tue, 05 Jan 2010 12:16
86 lines
4871 bytes
On 4 Sty, 17:22, Radomir Dopieralski <n...@sheep.art.pl> wrote:
> At Sun, 03 Jan 2010 17:28:23 +0100, Jan Kaliszewski wrote:
>
> >> I jak zoptymalizować ten kawałek z append i sort? czy wyszukać miejsce  
> >> gdzie ma się znaleźć liczba i użyć insert?
>
> > Patrz np. :http://docs.python.org/library/bisect.html(być może
>
> >> W sumie to podczas pisania nawet specjalnie się nie zastanawiałem nad  
> >> wydajnością, tylko moją wygodą ;]
>
> > I słusznie (przedwczesna optymalizacja to źródło [prawie] wszelkiego zła,
> > jak uważa np. GvR), ale bez przesady -- nie należy używac antyoptymalnych
> > konstrukcji, które mogą spowolnić program o rząd wielkości...
>
> Akurat pythonowy sort jest zoptymalizowany dla tego przypadku (prawie
> posortowana lista), wiec nie ma sie co tym za bardzo przejmowac.
> Wstawianie w srodek listy moze byc bardziej kosztowne niz sort ;)

Hmm, akurat optymalizacja optymalizacją, sortowanie posortowanej listy
nigdy nie wygra z bisekcją. Ale spójrzmy na liczby. Próba dla 100
elementowej, posortowanej listy, wstawienie 10 elementów w (powiedzmy)
środek. Potem to samo dla 10k i 100k elementów.

>>> import bisect, timeit
>>> def naive(seq):
...	for i in xrange(len(seq)/2, len(seq)/2+10):
...		seq.append(i)
...		seq.sort()
...
...
>>> def bisecting(seq):
...	for i in xrange(len(seq)/2, len(seq)/2+10):
...		bisect.insort_left(seq, i)
...
...
# 100 elementów, 3 powtórzenia x 1000 iteracji
>>> s_n = timeit.Timer('naive(range(100))', 'from __main__ import naive')
>>> s_n.repeat(number=1000)
[0.10980892822999522, 0.063997798602940748, 0.041371738586803986]

>>> s_b = timeit.Timer('bisecting(range(100))', 'from __main__ import bisecting')
>>> s_b.repeat(number=1000)
[0.027691228913226951, 0.027691228912772203, 0.027354035219559591]

>>> s_0 = timeit.Timer('range(100)')
>>> s_0.repeat(number=1000)
[0.0013677716024176334, 0.0013529652510442247, 0.001442362087800575]

# 10000 elementów, 3 powtórzenia x 1000 iteracji
>>> s_n = timeit.Timer('naive(range(10000))', 'from __main__ import naive')
>>> s_n.repeat(number=1000)
[3.1164896655859593, 3.1417747227651489, 3.121320447151902]

>>> s_b = timeit.Timer('bisecting(range(10000))', 'from __main__ import bisecting')
>>> s_b.repeat(number=1000)
[0.22504703810091087, 0.22329150771929562, 0.21956449772278575]

>>> s_0 = timeit.Timer('range(10000)')
>>> s_0.repeat(number=1000)
[0.15361896553895349, 0.15845170266038622, 0.15496019745523881]

# 100000 elementów, 3 powtórzenia x 1000 iteracji
>>> s_n = timeit.Timer('naive(range(100000))', 'from __main__ import naive')
>>> s_n.repeat(number=1000)
[35.27313806643042, 35.755941048373188, 35.417473449837871]

>>> s_b = timeit.Timer('bisecting(range(100000))', 'from __main__ import bisecting')
>>> s_b.repeat(number=1000)
[2.46779213559239, 2.477303120927445, 2.4755632349924781]

>>> s_0 = timeit.Timer('range(100000)')
>>> s_0.repeat(number=1000)
[1.664749011396907, 1.5594118805602193, 1.5986207744281273]

Na wykresie wyglądałoby to ładniej, ale na służbowym sprzęcie nie mam
odpowiednich bibliotek. Wniosek? Jeśli lista jest posortowana, to
wstawianie bisekcyjne jest bardzo tanie. Nawet tuningowane sortowanie
Pythona się nie umywa. Czyli posortować raz i wstawiać z głową. LOC
per 1 użycie pozostaje bez zmian (append+sort vs import i insort). ;-)

Chyba, że się mylę, wtedy proszę mnie poprawić. :)

--
pozdrawiam
i0 //SMG
Technical Details
Message-ID: <459ad528-f7a6-4f06-8ce4-d7af695b3c03@q4g2000yqm.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!q4g2000yqm.googlegroups.com!not-for-mail
References: <hhorn8$7ta$1@atlantis.news.neostrada.pl> <a99ed17d-e589-4ea7-87bd-7f551f284852@u41g2000yqe.googlegroups.com> <hhp2v8$kps$1@atlantis.news.neostrada.pl> <op.u5ytdlmqfvx12t@jerzozwiesz.home.aster.pl> <slrnhk45dm.2ub.news@atos.wmid.amu.edu.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!q4g2000yqm.googlegroups.com!not-for-mail
From: i0cus <slawomir.gwizdowski@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: B-drzewo w Pythonie
Date: Tue, 5 Jan 2010 04:16:20 -0800 (PST)
Organization: http://groups.google.com
Lines: 97
Message-ID: <459ad528-f7a6-4f06-8ce4-d7af695b3c03@q4g2000yqm.googlegroups.com>
References: <hhorn8$7ta$1@atlantis.news.neostrada.pl> <a99ed17d-e589-4ea7-87bd-7f551f284852@u41g2000yqe.googlegroups.com>  <hhp2v8$kps$1@atlantis.news.neostrada.pl> <op.u5ytdlmqfvx12t@jerzozwiesz.home.aster.pl>  <slrnhk45dm.2ub.news@atos.wmid.amu.edu.pl>
NNTP-Posting-Host: 167.232.240.15
Mime-Version: 1.0
X-Trace: posting.google.com 1262693780 8393 127.0.0.1 (5 Jan 2010 12:16:20 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Tue, 5 Jan 2010 12:16:20 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: q4g2000yqm.googlegroups.com; posting-host=167.232.240.15;  posting-account=vnnxEQoAAAAYmfoMdhRbYHUrQa3K8Gae
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.6)  Gecko/20091201 Firefox/3.5.6,gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit