[image]

Опять о скорости

 
+
-
edit
 

Balancer

администратор
★★★★★
Измерил тут было скорость и удивился. Новые версии Питона быстрее Перла в 2.5 раза! :D

А раньше, вроде, Питон тем ещё тормозом был... :)
   
+
-
edit
 

Vestel

разработчик OpenWorlds
Стоит смотреть, на то, что именно в задаче делается...
При работе со строками Python действительно делал Perl (но не сильно), а при работе с вычислениями я увидел совсем иную картину. Рекурсивно, считался 30 член прогрессии Фибоначи, и "удав" отстал приблизительно в 9.5 раз. Для тестирования использовался PII-Celeron300/96RAM c FreeBSD-4.8 без оптимизации ядра, замеры времени производил
time
.

Выложи свои тесты, было бы интересно сравнить, что, как и чем проверялось.
   
+
-
edit
 

Balancer

администратор
★★★★★
Вот я на рекурсивном Фибоначи и измерял :D

P3-1000, Gentoo Linux.


#!/usr/bin/perl -w

use strict;

sub fib
{
    return 1 if $_[0] < 2;
    return fib($_[0]-1) + fib($_[0]-2);
}

print fib(33);



$ time perl fib.pl
5702887
real    0m25.510s
user    0m23.162s
sys     0m0.054s

$ perl --version

This is perl, v5.8.5 built for i686-linux



def fib(n):
    if n < 2:
    return 1

    return fib(n-1) + fib(n-2)

print fib(33)



$ time python fib.py
5702887

real    0m15.663s
user    0m14.248s
sys     0m0.041s

$ python -V
Python 2.3.5


:)

Резльтат перла чуть улучшил, отказавшись от заведения переменной, но всё равно - почти вдвое.
   
+
-
edit
 

Vestel

разработчик OpenWorlds
А почему так строго (n < 2) , ведь Fib(2) = 1 и этим тоже можно пользоваться.
Во всяком случае, в том учебнике математики, что я учился в школе, опередение было именно такое: два первых равны 1, а каждый следующий сумме двух предыдущих. (Не цитата, потому как за ходом лет, учебник был утерян)

Вопрос не принципиальный, для данного примера.

time perl fib.pl
real    0m4.364s
user    0m2.870s
sys     0m0.010s

с кодом
fib.pl
#!/usr/bin/perl -w

use strict;

sub fib
{
    return 1 if $_[0] < 3;
    return fib($_[0]-1) + fib($_[0]-2);
}

$_=fib(28);
Заменил вывод на экран значения присвоением, чтобы добиться большей точности замера времени.
time python fib.py
real    0m1.288s
user    0m1.250s
sys     0m0.040s

И сорц к нему
fib.py
def fib(n):
        if n<3:
                return 1
        return fib(n-1) + fib(n-2)

a=fib(28)

Исполнялось на удаленном институтском шелле неизвесной конфигурации. Параметр поставил в 28, потому как больше Perl-овскую программу пинали за CPU exceed limit. Python c первой попытки напечатал мне значение 30 и никем обижен не был.
   
+
-
edit
 

Balancer

администратор
★★★★★
Vestel> А почему так строго (n < 2) , ведь Fib(2) = 1

Если уж оптимизировать, то до хвостовой рекурсии, или вообще до цикла нужно, благо, разворачивается :D

Нам же скорость измерить только нужно :)

Vestel> user 0m2.870s
Vestel> user 0m1.250s

Угу, пропорции те же. Но вывод можно было и не убирать, как я понимаю, он в sys, а не в user засчитается :) Вообще, приятная особенность Linux - можно одновременно все тесты запускать, когда они длительные, user-time сосчитается верно, даже если оно будет сильно меньше, чем real-time :)
   

FR0

новичок
Vestel>> А почему так строго (n < 2) , ведь Fib(2) = 1
Balancer> Если уж оптимизировать, то до хвостовой рекурсии, или вообще до цикла нужно, благо, разворачивается :D
Balancer> Нам же скорость измерить только нужно :)

Если использовать psyco то фибоначи для питона еще в 30 - 40 раз быстрее отрабатывает.
   

в начало страницы | новое
 
Поиск
Настройки






Статистика
Рейтинг@Mail.ru
АвиаТОП
 
Яндекс.Метрика
website counter
 
free counters