@Зорница Костадинова @Марий Йонов За Python 2.x се използва xrange, просто за
да бъде честен теста. Дали xrange е по-бърза от range, както ще се опитам да
обясня по-долу, не е много ясно =-).
Ето ги цифрите, които моята машина изкара за Python 3.0:
slavi@slavi-desktop:~$ python3.0 what.py
3.0rc1+ (py3k, Oct 28 2008, 09:22:29)
[GCC 4.3.2]
timeit(f1) = 4.67462801933
timeit(f2) = 6.26769399643
timeit(f3) = 7.48840403557
timeit(f4) = 5.50503206253
timeit(f5) = 4.57028889656
Първото, което ми направи впечатление бе, че f1 е осезаемо по-бърза от f2.
Единствената разлика между им е в .. = .. + ..
и .. +=
..
. Гледайки само кода, бих очаквал двете да са еднакво бързи. (Ако
трябва да съм честен докрай, бих очаквал += да е по-бърза, просто заради това,
че последните няколко години съм писал главно C++). Цифрите, обаче говорят
друго.
Busted Myth 1: foo += bar
е по-бърз (или поне не по-бавен) от
foo = foo + bar
Малко неочаквано. Дори гледайки кода на Python, не можах да си отговоря защо
е така (в Python/ceval.c, case BINARY_ADD:
и case
INPLACE_ADD:
са абсолютно идентични).
В почти всеки турориал за Python, се споменава, че стринговете в Python са
immutable и че правилния (разбирай бързия) начин, за конкатениране на низове е
''.join
. С други думи, f4 е за предпочитане пред наивния код от f1.
Ако, обаче, пак погледнем към цифричките:
Busted Myth 2: ''.join
е по-бърз от 'наивното' конкатениране на
низове
Гледайки само f4 и f5, веднага бих предположил, че f4 е по-бързата, защото не
се налага да се заделя (и обхожда) излишно памет. Повечето модерни машини смятат
по-бързо, отколкото четат и пишат в паметта. Част от причината, f5 да е по-бърза
(както Стефан спомена) е, че ''.join
винаги първо разпъва итератора
в списък и после изпълнява конкатернирането. Което ни води към:
Busted Myth 3: Итерирането е по-бързо от строенето на списъци
Тъжния извод от горните разсъждения е, че в Python не може да се каже
нищо за бързодействието на даден код, без да се направи
benchmark. Освен, ако не се казваш Guido van Rossum или Димитър Димитров.
Причината най-вероятно е, че на разработчиците на Python, просто не ги е
грижа особено за performance. Все пак, killer app-а за Python днес си остават
web приложенията. Ако ви пука за performance пишете C и използвайте ctypes или
Python API, за да си викате кода от Python.
Всеки спор относно, колко е бързо едно или друго в Python е просто ментална
матрубация =-)
12.04.2009
(променeно 13.04.2009)