LINUX.ORG.RU

Предварительный релиз Python 2.5


0

0

Вышла бета-версия Python 2.5.
Новое в языке:

  • однострочные условные выражения (аналог X?Y:Z, PEP 308)
  • новый оператор with (PEP 343)
  • генераторы превратились в полноценные сопрограммы (coroutines, PEP 342)
Новые модули в стандартной библиотеке:
  • ctypes (прямой вызов Си-функций из .so и .dll)
  • ElementTree (упрощённая работа с XML)
  • wsgiref (стандартный интерфейс между веб-приложением и веб-сервером)
  • hashlib, sqlite3

Многочисленные оптимизации, в т.ч. операции со строками ускорены на 30% (http://wiki.python.org/moin/NeedForSp...)

Полный список изменений: http://docs.python.org/dev/whatsnew/w...

Скачать: http://www.python.org/ftp/python/2.5/

>>> Подробности

Ответ на: комментарий от geek

Угу. Нормальный человек возьмер компилируемый язык с статическими типами

anonymous
()
Ответ на: комментарий от EasyRider

>Ну я вообще-то хотел узнать - правда или нет, а не изящно или не изящно

если питон на каждый чих будет дергать free() - то производительность упадет достаточно сильно

кроме того часть памяти питон все-таки возвращает.

видимо, как-то пытается прогнозирвать запросы программы =)

так что аффтар слукавил, или не понимает особенности работы интерпретаторов.

geek ★★★
()
Ответ на: комментарий от EasyRider

да, это известный факт -- для объектов меньше 256 байт питон использует собственный malloc, который не возвращает память в систему, а придерживает её для повторного использования. и иногда это приводит к разрастанию кучи

подробнее см. http://evanjones.ca/python-memory.html

обещают исправить в 2.5

anonymous
()
Ответ на: комментарий от stalkerg

там просили получить индекс элемента, а не значение

anonymous
()
Ответ на: комментарий от geek

>кроме того, питон эту память использует повторно. А вот системе действительно не отдает

Ага. Понял. Спасибо. imho неаккуратно как-то. А если я не собираюсь повторно использовать повторно?

EasyRider
()
Ответ на: комментарий от geek

> всего лишь не очень изящный способ прострелить себе ногу

ты не прав, это всё-таки баг.

> нормальный человек не будет такого делать

не аргумент -- код там приведён для приера.

а в большошй программе отследить такое поведение действительно крайне сложно; и разработчики zope, например, рекомендуют ставить памяти побольше и изредка перезапускать сервер

anonymous
()
Ответ на: комментарий от EasyRider

>Ага. Понял. Спасибо. imho неаккуратно как-то. А если я не собираюсь повторно использовать повторно?

система положит неиспользованную память в своп. Какие проблемы? :)

кроме того, насколько я понял, резервирование оперативки зависит от того, каким образом память была выделена. Если много-много маленьких порций - то часть потом резервируется, чтобы не тратить время на запросы оперативки у системы (мало ли ещё один такой цикл попадется). А если одним куском - то она потом отдается системе без проблем

geek ★★★
()
Ответ на: комментарий от EasyRider

> А если я не собираюсь повторно использовать повторно?

есть два выхода: поправить код так чтобы не создавалось одновременно очень много мелких объектов; дождаться выхода 2.5 где это исправлено; если код поправить не получается а проблема не смертельная -- забить и ничего не делать.

anonymous
()
Ответ на: комментарий от anonymous

>ты не прав, это всё-таки баг.

только что объяснил, почему это не баг, а фича:)

а реального использования выделения памяти _таким_ образом автор так и не смог придумать :)

>а в большошй программе отследить такое поведение действительно крайне сложно; и разработчики zope, например, рекомендуют ставить памяти побольше и изредка перезапускать сервер

ну zope по-моему написана в принципе через то место, в честь которого она названа

geek ★★★
()
Ответ на: комментарий от EasyRider

> http://sin-avatar.narod.ru/stories/sad_story_about_python/index.html

но автор печальной заметки тоже неправ -- в той части где он возмущается что мол "free() на некоторых платформах не работает, а как же тогда для них пишут программы?"

free() может и работать, но работать слишком медленно или слишком криво. питон ведь не только на современных юниксах живёт, а ещё и на всяком старье вроде win95

те кто отвечали что мол не надо делать range(100000), конечно **даки

а ещё интересно почему в октябре 2005-го никто не смог указать на статью по этой проблеме, опубликованную в 2004-м.

anonymous
()
Ответ на: комментарий от EasyRider

http://sin-avatar.narod.ru/stories/sad_story_about_python/index.html Чел реально ИДИОТ и БАРАН! Он не пробовал сделать так: a = range(1,1000000) >>> del a >>> a = range(1,1000000) Дополнительная память НЕ будет выделена. Это НОРМАЛЬНОЕ поведение любой системы, один раз ты выделил память, зачем зря её освобождать, если можно её использовать потом? Просто тупой необоснованный наезд типичного барана, который просто не хотел разобраться в простой вещи, но сразу всем хотел показать, какой он умный.

anonymous
()
Ответ на: комментарий от AVL2

> Так, дружеское подтрунивание.

Я, чес-гря, не понимаю предмета подтрунивания. Честно. Я вижу, что при апгрейде ряда систем и/или приложений на на них (в список входят Федора, FreeBSD, Дебиан - это то, с чем я лично встречался в рабочей или домашней деятельности), возможны, м-м-м, грабли. То есть, вроде, все поставлено, а толку - чуть, [под]система в нерабочем состоянии.

Да, Альт, возможно, напрасно взялся тянуть несколько питоньих версий одновременно. Это - проблема. С другой стороны, я вижу, что у меня на localhost, чуть я начинаю по работе писать что-то на питоне, _постоянно_ вылазит потребность посмотреть, а как ведет себя тот или иной модуль в 2.3, 2.2 а теперь вот и до 1.5, который в RH9 идет, докатился; не нужно ли в этом месте делать бэкпорт модуля для использования в старой версии. Это, понимаешь, нормальная такая рабочая практика. Лично у меня.

> Жаль, что это решение, скорее всего, будет проведено не везде.

Что заставляет тебя думать, что кто-то откажется. Тем более, почему ALT?

AlexM ★★★★★
()
Ответ на: комментарий от Cybem

Кстати, иногда операторные скобки действительно удобнее, например во встраивом коде. Хорошо-бы как в хаскеле - иметь возможность использовать оба варианта

anonymous
()
Ответ на: комментарий от Casus

>Тесты скорости мне не интересны.

Тогда уточняй это в вопросах "чем лучше". Ибо каков вопрос - таков и ответ.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Ну не нужно так тупить, да? Си и Питон - языки разных классов. Питон и Перл - одного. Или ты будешь сравнивать, например, карьерный самосвал и автобус?

>Меряться надо не скоростью расчетов, для этого ни Питон, ни Перл не предназначены.

Ага, если грузовики медленнее, чем болиды Ф-1, то скорость грузовиков сравнивать уже не нужно, так что ли?

KRoN73 ★★★★★
()

Это очень хорошо, что именно здесь зашла речь о числах Фибоначчи,
ведь именно эта задача отлично демонстрирует возможности языка.
Итак, добавим 2 строчки в fib.pl и смотрим результат:

denis@denis:~$ time python fib.py
3524578
real    0m17.146s
user    0m17.120s
sys     0m0.010s
denis@denis:~$ time /opt/perl/bin/perl fib.pl
3524578
real    0m14.679s
user    0m14.660s
sys     0m0.000s
denis@denis:~$ time /opt/perl/bin/perl fib_m.pl
3524578
real    0m0.071s
user    0m0.060s
sys     0m0.000s
denis@denis:~$ cat fib_m.pl
use Memoize;
memoize('fib');
sub fib
{
    return $_[0]<3 ? 1 : fib($_[0]-1)+fib($_[0]-2);
}
print fib(33);

Способность языка с помощью добавления 2-х строчек увеличить быстродействие в 100 раз - помоему это очень неплохо.
Не знаю насколько легко подобное делается на Python, но на Javaе
это требует изменения основного алгоритма.

R3M
()

Насчет ORM в Perl: рекомендую посмотреть DBIx::Class.
А вообще на CPANe их достаточно много: Class::DBI, Rose::DB::Object, ORM, Tangram ...

R3M
()
Ответ на: комментарий от anonymous

> psyco рулит, а жаба сосёт:)

жаба рулит, а psyco сосёт:)

$ gcj --main=fib fib.java -O3 -o fib
$ time ./fib
3524578

real    0m0.155s
user    0m0.140s
sys     0m0.016s

$ time perl ./fib_memoize.pl
3524578
real    0m0.264s
user    0m0.020s
sys     0m0.008s

$ time python ./fib-psyco.py
Traceback (most recent call last):
  File "./fib-psyco.py", line 1, in ?
    import psyco
ImportError: No module named psyco

real    0m0.027s
user    0m0.020s
sys     0m0.000s

anonymous
()
Ответ на: комментарий от anonymous

>user 0m0.020s

Народ, ну вы, сравнивая такие величины, хоть до 40 аргумент доведите :) В общем, чтобы осязаемое время работы было.

KRoN73 ★★★★★
()
Ответ на: комментарий от R3M

2 R3M * (*) (26.06.2006 10:26:56)

Примерно то же делает модуль psyco в Python-e

Вообще это можно сделать явно (почти в любом языке):

cache = {0:0, 1:1} def fib(n): global cache

if not cache.has_key(n): cache[n] = fib(n-1) + fib(n-2) return cache[n]

anonymous
()
Ответ на: комментарий от anonymous

то есть так:

cache = {0:0, 1:1}
def fib(n):
    global cache

    if not cache.has_key(n):
       cache[n] = fib(n-1) + fib(n-2)
    return cache[n]

anonymous
()
Ответ на: комментарий от anonymous

> Примерно то же делает модуль psyco в Python-e
Think of Psyco as a kind of just-in-time (JIT) compiler

Memoize делает совсем другое - запоминает результат вызова
f(x,y..m) и если происходит повторный вызов функции с теми же параметрами возвращает сохранённый ранее результат.

> Вообще это можно сделать явно (почти в любом языке):

Понятно, что явно можно даже на C. Но хочется чтоб "само" :-)

R3M
()
Ответ на: комментарий от R3M

> Способность языка с помощью добавления 2-х строчек увеличить быстродействие в 100 раз - помоему это очень неплохо. Не знаю насколько легко подобное делается на Python, но на Javaе это требует изменения основного алгоритма.

а разве это добавление двух строчек не есть изменение алгоритма?

весь смысл рекурсивного fib() -- замер стоимости вызова функции.
без рекурсии можно и в 10000 раз ускориться

anonymous
()
Ответ на: комментарий от R3M

>Memoize делает совсем другое - запоминает результат вызова f(x,y..m)

Какой ужас. Это на языке-то, который весь на сайд-эффектах работат? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от R3M

> Memoize делает совсем другое - запоминает результат вызова f(x,y..m) и если происходит повторный вызов функции с теми же параметрами возвращает сохранённый ранее результат.

В данном случае это - мошенничество :)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> а разве это добавление двух строчек не есть изменение алгоритма?

Да но это ВСЁ изменение. Сама функция не меняется.

> весь смысл рекурсивного fib() -- замер стоимости вызова функции. > без рекурсии можно и в 10000 раз ускориться

Тут уж даже в случае fib двумя строчками не отделаешься.

R3M
()
Ответ на: комментарий от R3M

>Тут уж даже в случае fib двумя строчками не отделаешься.

Если хвостовую рекурсию развернуть, то отделаешься :)

KRoN73 ★★★★★
()
Ответ на: комментарий от R3M

> Тут уж даже в случае fib двумя строчками не отделаешься.

а что же тогда делает твой memorize()?

он именно убивает рекурсию и заменяет экспоненциальный алгоритм на полиномиальный.

anonymous
()
Ответ на: комментарий от KRoN73

Ну а если f(n,m) - это например коэффициент риска кредитозаёмщика n
за месяц m и тяжёлой определяется выборкой из БД и используется в (и сама состоит из) сложных, но аналитических формулах?

R3M
()
Ответ на: комментарий от KRoN73

> Если хвостовую рекурсию развернуть, то отделаешься

ну разверни, посмотрим что из этого получится

anonymous
()
Ответ на: комментарий от anonymous

> а что же тогда делает твой memorize()?

Он не мой а M-J Dominus ;-)

> он именно убивает рекурсию и заменяет экспоненциальный алгоритм на полиномиальный.

Но делает это в ДВУХ строчках короче 20 символов! Это был ПРИМЕР возможностей ЯЗЫКА! Я хочу понять можно ли в общем случае сделать такое на Python ?

R3M
()
Ответ на: комментарий от anonymous

))я плакал > import psyco >ImportError: No module named psyco у автора поста видать проблемы с англицким.

да и не к чиму этот спор, думаю пару секунд погоды не делают. хотелось бы увидеть крупный проект на perl'e ибо с масштабируемостью у него, как мне кажется, не лады) да и вообще глупый какой-то спор, фанаты перла - не знают питона ну и наоборот%)

slav0nic
()
Ответ на: комментарий от R3M

> Я хочу понять можно ли в общем случае сделать такое на Python ?

можно, как именно -- см. выше по треду

anonymous
()
Ответ на: комментарий от R3M

>Я хочу понять можно ли в общем случае сделать такое на Python ?

Ну если на пальцах :)

#!/usr/bin/env python

def memorize(func):
    mhash={}
    def my_func(*args,**kwargs):
        a = str(args)+str(kwargs)
        if not a in mhash:
            mhash[a] = func(*args,**kwargs)
        return mhash[a]
    return my_func

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


fib = memorize(fib)

for n in xrange(1000):
    print fib(n)

anonymous
()
Ответ на: комментарий от anonymous

>ну разверни, посмотрим что из этого получится

=== cut ===
#!/usr/bin/python

def fib(n, a=1, b=0):
    if n>1:
        return fib(n-1, a+b, a)
    else:
        return a

print fib(33)
=== cut ===

# time python fib_tail1.py
3524578

real    0m0.018s
user    0m0.012s
sys     0m0.004s

Но в том-то и прикол, что это уже совсем другой алгоритм.

Кстати, для 500-го числа (число разбил на две строки):

# time python fib_tail1.py
13942322456169788013972438287040728395007025658769730726
4108962948325571622863290691557658876222521294125

real    0m0.018s
user    0m0.016s
sys     0m0.000s

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

> psyco рулит, а жаба сосёт:)
гониш, 33 специально подобрал чтоб скорость запуска измерить ?

time python test.py
433494437

real 0m13.664s
user 0m13.581s
sys 0m0.006s

time java -server fib_class
433494437

real 0m3.677s
user 0m3.618s
sys 0m0.015s

cat test.py
import psyco

psyco.full()

def fib(n):
if n>2:
return fib(n-1)+fib(n-2)
else:
return 1

print fib(43)

cat fib_class.java
public class fib_class
{
public static void main(String args[])
{
int f = fib(43);
System.out.println(f);
}

public static int fib(int n)
{
if (n > 2) return fib(n - 2) + fib(n - 1);
else return 1;
}
}

ed ★★
()
Ответ на: комментарий от anonymous

ну да, гвидо утверждает что это нафиг ненадо (гад такой)

anonymous
()
Ответ на: комментарий от slav0nic

> ))я плакал > import psyco >ImportError: No module named psyco у автора поста видать проблемы с англицким.

Что именно тебе перевести? У меня есть питон но нету psyco - сюрпрайз? (Хотя доставить могу). Какой следует вывод?

> да и не к чиму этот спор, думаю пару секунд погоды не делают.

А почему претензии ко мне а не к автору кода?

> хотелось бы увидеть крупный проект на perl'e ибо с масштабируемостью у него, как мне кажется, не лады)

Ну так посмотри. Что мешает?

anonymous
()
Ответ на: комментарий от KRoN73

> Это на языке-то, который весь на сайд-эффектах работат? :)

Может подучишь язык всё-таки? Через несколько лет активного использования поймёшь всю глибину своего заблуждения. :)

mihalych ★★★
()
Ответ на: комментарий от mihalych

>Через несколько лет активного использования поймёшь всю глибину своего заблуждения. :)

Вот именно за несколько лет использования Перла я и понял всю "глибину" его сайдэффектов...

Впрочем, не один я это понимаю, сложных проектов на Perl всегда было мало, а чем дальше, тем их остаётся меньше...

KRoN73 ★★★★★
()
Ответ на: комментарий от slav0nic

> мля, я говорю что без psyco конечно java будет быстрее любого интерпритируемого языка (разве что кроме lua =) )

А lua быстр? (это просто вопрос, без сарказма).

SKYRiDER ★★★
()
Ответ на: комментарий от KRoN73

Это больше на скорость запуска интерпретатора Perl похоже... :)

$ time perl a.pl
3524578

real 0m0.007s
user 0m0.002s
sys 0m0.005s
$ cat a.pl
#!/usr/bin/perl

use strict;

sub fib
{
$_[1] = 1 if not defined $_[1];
return $_[0] > 1? fib($_[0]-1,$_[1]+$_[2], $_[1]): $_[1];
}

print fib(33), "\n";

Casus ★★★★★
()
Ответ на: комментарий от KRoN73

То что многие средние программисты не в силах осилить Perl, пожалуй соглашусь. Только гордиться тут нечему. А проектов всегда хватало:

http://freshmeat.net/browse/176/

Большинство больших проектов на Perl внутри-организационные. У меня в компании 20 таких внутренних проектов, от CMS и всевозможных поисковых систем до сервисов web с GUI для зарегистрированных пользователей.

mihalych ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.