Article View: pl.comp.lang.python
Article #27124Re: B-drzewo w Pythonie
From: i0cus
Date: Tue, 05 Jan 2010 12:16
Date: Tue, 05 Jan 2010 12:16
86 lines
4871 bytes
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-mailReferences:
<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