Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скорость питона. 
:(
    Опции темы
allexdav
Дата 17.4.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



Тестировал код, написанный на питоне (+ Psyco) и его аналог на яве. 
Получилось, что питон проигрывает яве процентов 5 - 10 ( если ява без ключа -server) 
То  ли я балбес, то ли на самом деле так smile  
PM MAIL ICQ   Вверх
J2A
Дата 17.4.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Версия python? версия psyco? версия java? платформа? условия тестирования? тестируемый код? 

Это сообщение отредактировал(а) J2A - 17.4.2006, 17:01
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Бонифаций
Дата 17.4.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



всего на 10? Это звучит интересно. покажите пожалуйста код.  


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
allexdav
Дата 17.4.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



Версия питона 2.4
Версия Psyco - последняя
Версия JAva 1.5.06
Платформа: AMD Athlon 64 3000+ 1Gb 
Код на Питоне
Код

import time
import random
import psyco
psyco.full()
d = {}
l = []
t = time.time()
for i in range(0,100):
    for i in range(0,1000000):
        d[i] = (i+1)
    for i in range(0,1000):
        l.append(d[int( random.random() * 1000000)])
print time.time() - t

Выводит соответсвенно 
Код

>>> 
56.9839999676
>>> 

Код на Яве
Код

package javaapplication2;
import java.util.ArrayList;
import java.util.Random;
public class Main {
    public Main() {
    }
    public static void main(String[] args) {
        long t1 =System.currentTimeMillis();
        for(int a = 0; a < 100; a++ )  {     
        Random r = new Random();
        r.setSeed(System.currentTimeMillis());
        ArrayList al = new ArrayList();
        int i = 0;  
        while(i < 1000000) {
            al.add(i);
            i++;
        }   
        Object mas [] = new Object [1000];
        int k = 0;
        for(int j = 0; j < 1000; j++) {
            k = (int) (r.nextFloat() * 1000000);
            mas[j] = al.get( k );
        }
    }
        System.out.println(System.currentTimeMillis()  -  t1);
    }
}

Выводит
Код

50079

соответственно подели одно на другое получим, что разница составляет 13 процентов. Вот. 
Или это некорректный тест и производительность им мерить нельзя? 
PM MAIL ICQ   Вверх
J2A
Дата 17.4.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Тест некорректен. Реализация генератора случайных чисел в различных языках различна. Как по скорости, так и по качеству. Нужно было использовать одинаковый набор данных. Однако ж даже при такой постановке теста, в рамках "игры" с питоном можно получить те самые 10%:
1. Прогоняю твой тест (единственно, что миллион снизил до сотни тысяч, а то памяти не хватало...) на дефолтном python-2.3
2. Заменяю range на xrange
3. Прогоняю с xrange, на python-2.4

Результаты:
Код

py2.3: range:  11.26 11.30 11.49
py2.3: xrange: 10.44 10.71 10.63
py2.4: xrange:  9.71 10.10  9.90


А java....
Код

$ javac Main.java 
Main.java:15: cannot resolve symbol
symbol  : method add (int)
location: class java.util.ArrayList
            al.add(i);
              ^
1 error
$ java -version
java version "1.4.2_04"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)
Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode)
 

P.S. А psyco ничего не дает для этого кода... всё в пределах погрешности или около того. 

Это сообщение отредактировал(а) J2A - 17.4.2006, 20:46
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
powerOn
Дата 18.4.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159




Цитата

$ javac Main.java 
Main.java:15: cannot resolve symbol
symbol  : method add (int)
location: class java.util.ArrayList
            al.add(i);
              ^
1 error
$ java -version
java version "1.4.2_04"
Java™ 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)
Java HotSpot™ Client VM (build 1.4.2_04-b05, mixed mode)


Ты бы еще версию Java 1.0 взял...  smile 

В 1.4.2_04 нельзя добавлять примитивные элементы примитивных типов в ArrayList. Элемент сначала надо обернуть в объект. Например, так:
Код

ArrayList al = new ArrayList();
        int i = 0;  
        while(i < 1000000) {
            al.add(new Integer(i));
            i++;
        }  

Ссылка на доку (1.4.2) : http://java.sun.com/j2se/1.4.2/docs/api/ja.../ArrayList.html 
Ссылка на доку последней версии (1.5.0) : http://java.sun.com/j2se/1.5.0/docs/api/ja.../ArrayList.html 
А вообще нужно последнии версии продуктов использовать, а то получается один на новенькой оптимизированной платформе, а другой на старой... Не правильно это...

 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
pythonwin
Дата 18.4.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Товарищи! Для измерения скорости выполнения кода используйте профиллеры. Для Python:

import profile
-------
def main():
   бла-бла-бла
-------
profile.run('main()')
 
PM WWW GTalk Jabber   Вверх
allexdav
Дата 18.4.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



чтобы использовать профалер, нужно то, что он будет измерять smile функции то есть
в этом случае функция одна - следовательно, использование профайлера ничего не даст для замера производительности
Код

3.89100003242
         140 function calls in 3.981 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        5    0.037    0.007    0.037    0.007 :0(acquire)
        3    0.000    0.000    0.000    0.000 :0(allocate_lock)
        1    0.000    0.000    0.000    0.000 :0(append)
        2    0.000    0.000    0.000    0.000 :0(dumps)
        3    0.000    0.000    0.000    0.000 :0(get)
        9    0.000    0.000    0.000    0.000 :0(get_ident)
        4    0.000    0.000    0.000    0.000 :0(has_key)
        4    0.000    0.000    0.000    0.000 :0(isinstance)
        6    0.000    0.000    0.000    0.000 :0(len)
        2    0.000    0.000    0.000    0.000 :0(pack)
       11    0.305    0.028    0.305    0.028 :0(range)
        3    0.000    0.000    0.000    0.000 :0(release)
        2    0.000    0.000    0.000    0.000 :0(select)
        2    0.002    0.001    0.002    0.001 :0(send)
        1    0.018    0.018    0.018    0.018 :0(setprofile)
        2    0.000    0.000    0.000    0.000 :0(time)
        1    0.044    0.044    3.963    3.963 <string>:1(?)
        2    0.000    0.000    0.000    0.000 <string>:1(fileno)
        1    0.000    0.000    3.981    3.981 profile:0(main())
        0    0.000             0.000          profile:0(profiler)
        1    3.575    3.575    3.919    3.919 roc.py:6(main)
       14    0.000    0.000    0.000    0.000 rpc.py:149(debug)
        2    0.000    0.000    0.040    0.020 rpc.py:206(remotecall)
        2    0.000    0.000    0.002    0.001 rpc.py:216(asynccall)
        2    0.000    0.000    0.037    0.019 rpc.py:236(asyncreturn)
        2    0.000    0.000    0.000    0.000 rpc.py:242(decoderesponse)
        2    0.000    0.000    0.037    0.019 rpc.py:277(getresponse)
        2    0.000    0.000    0.000    0.000 rpc.py:285(_proxify)
        2    0.000    0.000    0.037    0.018 rpc.py:293(_getresponse)
        2    0.000    0.000    0.000    0.000 rpc.py:315(newseq)
        2    0.000    0.000    0.002    0.001 rpc.py:319(putmessage)
        3    0.000    0.000    0.000    0.000 rpc.py:545(__getattr__)
        2    0.000    0.000    0.000    0.000 rpc.py:584(__init__)
        2    0.000    0.000    0.040    0.020 rpc.py:589(__call__)
        2    0.000    0.000    0.000    0.000 threading.py:111(release)
        1    0.000    0.000    0.000    0.000 threading.py:126(_acquire_restore)
        1    0.000    0.000    0.000    0.000 threading.py:133(_release_save)
        1    0.000    0.000    0.000    0.000 threading.py:143(_is_owned)
        2    0.000    0.000    0.000    0.000 threading.py:147(Condition)
        2    0.000    0.000    0.000    0.000 threading.py:152(__init__)
        1    0.000    0.000    0.037    0.037 threading.py:195(wait)
        4    0.000    0.000    0.000    0.000 threading.py:39(__init__)
        7    0.000    0.000    0.000    0.000 threading.py:44(_note)
        9    0.000    0.000    0.000    0.000 threading.py:670(currentThread)
        2    0.000    0.000    0.000    0.000 threading.py:76(RLock)
        2    0.000    0.000    0.000    0.000 threading.py:81(__init__)
        2    0.000    0.000    0.000    0.000 threading.py:93(acquire)
 

вывод здесь конечно большой, но чисто справочный smile в случае замера производительности - не интересен.

Добавлено @ 13:04 
2 J2A
я не о десяти процентах, а о сравнимости скорости питона со скоростью явы. Мне всегда казалось, что ява должна быть пошустрее smile 

Это сообщение отредактировал(а) allexdav - 18.4.2006, 13:01
PM MAIL ICQ   Вверх
Void
Дата 18.4.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Цитата(MoonCat @  18.4.2006,  10:46 Найти цитируемый пост)
В 1.4.2_04 нельзя добавлять примитивные элементы примитивных типов в ArrayList. Элемент сначала надо обернуть в объект. 

А в Java 1.5 просто ввели автобоксинг. Писанины меньше, но примитив все равно заворачивается в объект. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Бонифаций
Дата 18.4.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



покажите пожалуйста вывод vmstat во время работы  и питона и явы/ Я бы предположил что ява просто ест больше памяти и система ушла в своп во время теста явы.

А вообще (тогда тоило бы и массив d=[] в цикле, раз уж вы в цикле создаете каждый раз arraylist 


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
nerezus
Дата 18.4.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Что-то вы с джавой намутили. Нужно позвать кодеров из раздела с джавой, чтобы нормально протестировать.

А то получится у вас еще, что питон быстрее джавы  smile  


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
allexdav
Дата 18.4.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



код на яве писал кодер из явы smile 
В системе - 1 гиг оперативы. ява на этом тесте есть 260 метров ( вроде, сейчас не помню... в системе сответственно почтив 4 раза больше... чего ей в своп уходить - не знаю) тестировал на виндосе, vmstat  я так понял линуксовая утилита smile ) 
PM MAIL ICQ   Вверх
Void
Дата 18.4.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Немножко переделал код, потому что в варианте на Питоне использовался словарь (хэш-таблица), а на Java — динамически растущий список.

Цитата
java version "1.5.0_06"
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot™ 64-Bit Server VM (build 1.5.0_06-b05, mixed mode)

Цитата
ActivePython 2.4.2 Build 10 (ActiveState Corp.) based on
Python 2.4.2 (#65, Jan 17 2006, 16:09:15) [MSC v.1400 64 bit (AMD64)] on win32


Psyco в бинариках для Python64 нет, так что будем мерять голый интерпретатор.

Время среднее из 6 запусков, исключая первый.

Первый вариант: оба со списком:
Код
import time
import random

t = time.time()
for i in xrange(0,100):
    d = []
    l = []
    for i in xrange(0,1000000):
        d.append(i + 1)
    for i in xrange(0,1000):
        l.append(d[int(random.random() * 1000000)])
print time.time() - t

53.9 с
Код
import java.util.*;

public class Test {
    public static void main(String[] args) {
        long t1 = System.currentTimeMillis();
        Random r = new Random();
        r.setSeed(System.currentTimeMillis());
        for(int a = 0; a < 100; a++) {     
            List<Integer> d = new Vector<Integer>();
            for (int i = 0; i < 1000000; ++i) {
                d.add(i);
            }   
            List<Integer> l = new Vector<Integer>();
            for(int j = 0; j < 1000; j++) {
                int k = (int) (r.nextFloat() * 1000000);
                l.add(d.get(k));
            }
        }
        System.out.println(System.currentTimeMillis() - t1);
    }
}

17.1 с

Без комментариев.

Второй вариант: оба с хэш-таблицей. Тут питонистов ожидает приятный сюрприз smile
Код
import time
import random

t = time.time()
for i in xrange(0,100):
    d = {}
    l = []
    for i in xrange(0,1000000):
        d[i] = i
    for i in xrange(0,1000):
        l.append(d[int(random.random() * 1000000)])
print time.time() - t

45.9 с
Код
import java.util.*;

public class Test {
    public static void main(String[] args) {
        long t1 = System.currentTimeMillis();
        Random r = new Random();
        r.setSeed(System.currentTimeMillis());
        for(int a = 0; a < 100; a++) {     
            Map<Integer, Integer> d = new HashMap<Integer, Integer>();
            for (int i = 0; i < 1000000; ++i) {
                d.put(i, i);
            }   
            List<Integer> l = new Vector<Integer>();
            for(int j = 0; j < 1000; j++) {
                int k = (int) (r.nextFloat() * 1000000);
                l.add(d.get(k));
            }
        }
        System.out.println(System.currentTimeMillis() - t1);
    }
}

114.0 с — при максимальном хипе в 192 Мб (-Xmx192M).
Скорость очень сильно зависит от выставленного размера хипа. При 192 Мб наблюдается максимум, при уменьшении начинает очень тормозить (<128 Мб вообще вылетает), при увеличении до 512 Мб скорость падает процентов на 20. Питон в этом тесте съел около 80 Мб памяти.  

Это сообщение отредактировал(а) Void - 18.4.2006, 20:01


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
allexdav
Дата 18.4.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


лоботомированное тело тиклского питоноида



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.3.2006
Где: Россия, Нижний Но вгород

Репутация: 3
Всего: 3



ЭЭЭ что - то у меня в 1 случае разрыв не столь драматичен smile 
ява говорит, что 
41875
а питон, что
70.9850001335
может быть что - то со параметрами запуска явы? 
 
PM MAIL ICQ   Вверх
Void
Дата 18.4.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



allexdav, я под серверной VM запускал (другой нет просто smile ). 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.