LINUX.ORG.RU

[python3] не всё так плохо


0

0
# 2.py
result = 1
for i in xrange(1,20000):
	result*=i
print result
# 3.py
result = 1
for i in range(1,20000):
	result*=i
print(result)
$ time python2.5 2.py > /dev/null
real	0m5.437s
user	0m5.360s
sys	0m0.024s

$ time python3.0 3.py > /dev/null 
real	0m1.931s
user	0m1.912s
sys	0m0.004s

А на каких тестах Python3 сливает?

★★★★

% python -m test.pystone Pystone(1.1) time for 50000 passes = 1.23 This machine benchmarks at 40650.4 pystones/second

Третьей версии нет под рукой, не могу запустить на py3k. По официальным данным пайстоун стал несколько медленнее. Где именно - хз, он, похоже, не показывает, в каких местах стал быстрее, а в каких медленнее. Кури его сорцы: http://svn.python.org/view/python/trunk/Lib/test/pystone.py?rev=65135&vie...

Померишь - вернись, расскажи :)

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

ааа, фак, переносы строк :((

% python -m test.pystone
Pystone(1.1) time for 50000 passes = 1.23
This machine benchmarks at 40650.4 pystones/second

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

ахренеть
он напечатал число на 10 экранов

kto_tama ★★★★★
()

На куче других тестов. Вообще, мне хочется профайлером пройтись по питону и посмотреть во что упирается. Точно известно что много времени занимает создание и удаление объектов которое происходит очень часто. Щас на bugs.python.org обсуждают целесообразность внесения likely/unlikely как это сделано в линухе.

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

>Точно известно что много времени занимает создание и удаление объектов которое происходит очень часто.

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

>Щас на bugs.python.org обсуждают целесообразность внесения likely/unlikely как это сделано в линухе.

Ничего не понял. Дай ссылку, плз. Ключевые слова "likely" и "unlikely" - самый лучший способ сделать нечто ненаходимым с помощью поиска...

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

Отнюдь, как же там про рут оф ол ивил? :) Слоты (равно как и прочие оптимизационные выкрутасы) нужно юзать только тогда, когда их нужно юзать. То есть по итогам профилировки.

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

> Отнюдь, как же там про рут оф ол ивил? :)

Ну и какой ивил от слотов?

> Слоты (равно как и прочие оптимизационные выкрутасы)

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

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

Ивил не от слотов, а от преждевременной оптимизации, примером которой является применение слотов не по месту.

__slots__ are implemented at the class level by creating descriptors (Implementing Descriptors) for each variable name. As a result, class attributes cannot be used to set default values for instance variables defined by __slots__; otherwise, the class attribute would overwrite the descriptor assignment.

И это только одно неприятное их свойство. Кроме того, When inheriting from a class without __slots__, the __dict__ attribute of that class will always be accessible, so a __slots__ definition in the subclass is meaningless. То есть если приходится разбирать большое количество, скажем, объектов, возвращенных из ORM, нет никакого смысла в использовании слотов - сплошные ограничения вместо профита. Ну и т.д.

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

В принципе "банальные ошибки", на мой вкус, лучше отлавливать статическим анализатором кода (хоть блин пайлинт и тупит порой). А слоты - именно тогда, когда создание экземпляров по результатам профилирования в первой десятке. имхо.

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

> Для элементарных типов оно почти ничего не стоит.

С профайлером не поспоришь :). Любой вызов функции как минимум сопровождается аргументами(тут делается тьюпл из них), возвращаемым значением(даже функции которые не возвращают значение при возврате возвращают None) и уничтожением тьюпла в котором хранились аргументы. Ну и плюс ещё кучей всего, я уже подробностей не помню. Вроде как каждая операция недолгая, но их просто неимоверное кол-во. Если собрать питон с деббагом и затать export PYTHONDUMPREFS=1 перед запуском то увидишь сколько десятков тысяч объектов будет :). У меня 33549 refs сразу после запуска.

> Ничего не понял. Дай ссылку, плз.

Вот типа такого хотят замутить: http://kerneltrap.org/node/4705 Впрочем, зря я про это начал, этим сильно не ускоришь ничего. Так, лёгкая оптимизация.

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

> As a result, class attributes cannot be used to set default values for instance variables defined by __slots__

По крайней мере для меня, это не является неудобством.

> When inheriting from a class without __slots__, the __dict__ attribute of that class will always be accessible, so a __slots__ definition in the subclass is meaningless. То есть если приходится разбирать большое количество, скажем, объектов, возвращенных из ORM, нет никакого смысла в использовании слотов - сплошные ограничения вместо профита.

Что-то я лично ограничений не вижу - ну, не сработает... в чем ограничение-то? Насчет "большое количество объектов" - дескрипторы создаются для класса, ЕМНИП, так что это капля в море.

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

>В принципе "банальные ошибки", на мой вкус, лучше отлавливать статическим анализатором кода (хоть блин пайлинт и тупит порой)

pylint настолько слабое средство отлова ошибок, что этот аргумент не прокатывает :)

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

Хе-хе, раз уж заговорили о типичных ошибках вставлю и свои пять копеек. Вместо того чтобы ругаться на динамескую сущность питона надо просто тупо тестировать перед тем как сделать релиз. Вроде, простой совет, ан нет, регулярно народ жалуется что дескать питон как бейсик, опечатался в названии переменной и "всё глючит" :)

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

> Вместо того чтобы ругаться на динамескую сущность питона надо просто тупо тестировать перед тем как сделать релиз.

Ичо, у тебя 100% test coverage?

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

>>> class Z(object): pass
...
>>> class ZZ(Z):
...     __slots__ = ('foo', )
...
>>> z = ZZ()
>>> z.bar = 1
>>> z.bar
1

Какой смысл в слотах в таких случаях вообще? В поиске ошибок они тут не помогут.

"pylint настолько слабое средство отлова ошибок, что этот аргумент не прокатывает :)"
Речь кажется шла о "банальных ошибках" :) Для них он как раз и предназначен. А если речь о чем-то более серьезном, то это как правило ошибка в дизайне (за что люблю Python, так это за то, что внутреняя структура языка очень стройна и логична, т.е. сама по себе не может быть источником нетривильных ошибок). А ошибку в дизайне использование слотов тоже никак не решит :) Или я может чего-то не понимаю?

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

> у тебя 100% test coverage?

Тех детских ошибок о которых обычно пишут у меня нет :). Собстно сказал я про это в ответ на твою реплику о том что слоты это средство отлова банальных ошибок. А потом задумался-что же это за банальные ошибки?

Так какие ошибки помогут найти слоты?

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

> присвоения несуществующим полям.

Так я и думал. А теперь расскажу как избежать этой и многих других проблем :). Тестирование всех ветвей в программе это сразу выявит. Не тестирование всех комбинаций ветвления и не тестирование на всём диапазоне входных данных а просто тупая проверка работает вообще код. Плюс автокомплетишн в редакторе помогает от таких проблем.

Такая ошибка возникает только у тех кто по-быстрому написал программу и даже не проверил её. В своём коде я с такими ошибками вообще не сталкиваюсь.

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