<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Вышла первая альфа Python 3.0</title>
	<atom:link href="http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/</link>
	<description>сообщество программистов</description>
	<lastBuildDate>Thu, 18 Mar 2010 20:18:04 +0200</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Anonymous</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10991</link>
		<dc:creator>Anonymous</dc:creator>
		<pubDate>Tue, 04 Sep 2007 17:30:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10991</guid>
		<description>&lt;blockquote&gt;В методе timeit по умолчанию 1000000 отераций )))&lt;/blockquote&gt;

да, это действительно так. ахаха, как это смешно ))0ноль)</description>
		<content:encoded><![CDATA[<blockquote><p>В методе timeit по умолчанию 1000000 отераций )))</p></blockquote>
<p>да, это действительно так. ахаха, как это смешно ))0ноль)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: koder</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10972</link>
		<dc:creator>koder</dc:creator>
		<pubDate>Tue, 04 Sep 2007 08:57:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10972</guid>
		<description>&gt; измерение всего одной итерации всегда будет давать разный результат.

В методе timeit по умолчанию 1000000 отераций )))</description>
		<content:encoded><![CDATA[<p>&gt; измерение всего одной итерации всегда будет давать разный результат.</p>
<p>В методе timeit по умолчанию 1000000 отераций )))</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Anonymous</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10970</link>
		<dc:creator>Anonymous</dc:creator>
		<pubDate>Tue, 04 Sep 2007 06:18:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10970</guid>
		<description>это не тот же самый код. простая замена x, y на *args, **kwargs сразу же даёт проседание производительности по timeit() на 25%, что в принципе доказывает бредовость идеи меряния количества инструкций и делания на основе этого каких-то выводов - простое изменение кода может убрать всю выигранную производительность. 

потому что это язык высокого уровня.

по поводу фактической производительности. измерение всего одной итерации всегда будет давать разный результат. 

&lt;code&gt;print(timeit.Timer(&quot;f2(1, 2)&quot;, &quot;from __main__ import f2&quot;).timeit(1000000))
print(timeit.Timer(&quot;f1(1, 2)&quot;, &quot;from __main__ import f1&quot;).timeit(1000000))&lt;/code&gt;

3.90879893303
2.2824139595

быстрее не в 4 и не в 2 раза. 

плюс с использованием *args, **kwargs, timeit() при разных замерах даёт отношение первого времени ко второму с вариациями +-10%, что говорит или о том, что timeit() не точен, или о том же, о чём я на писал в первом абзаце.

но в целом убедили, да. если дизассемблировать код и считать инструкции, то можно написать быстрее.</description>
		<content:encoded><![CDATA[<p>это не тот же самый код. простая замена x, y на *args, **kwargs сразу же даёт проседание производительности по timeit() на 25%, что в принципе доказывает бредовость идеи меряния количества инструкций и делания на основе этого каких-то выводов &#8211; простое изменение кода может убрать всю выигранную производительность. </p>
<p>потому что это язык высокого уровня.</p>
<p>по поводу фактической производительности. измерение всего одной итерации всегда будет давать разный результат. </p>
<p><code>print(timeit.Timer("f2(1, 2)", "from __main__ import f2").timeit(1000000))<br />
print(timeit.Timer("f1(1, 2)", "from __main__ import f1").timeit(1000000))</code></p>
<p>3.90879893303<br />
2.2824139595</p>
<p>быстрее не в 4 и не в 2 раза. </p>
<p>плюс с использованием *args, **kwargs, timeit() при разных замерах даёт отношение первого времени ко второму с вариациями +-10%, что говорит или о том, что timeit() не точен, или о том же, о чём я на писал в первом абзаце.</p>
<p>но в целом убедили, да. если дизассемблировать код и считать инструкции, то можно написать быстрее.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: koder</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10968</link>
		<dc:creator>koder</dc:creator>
		<pubDate>Tue, 04 Sep 2007 00:33:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10968</guid>
		<description>Те-же данные для той-же машины и python 2.5.1

t_closure = 0.7415
t_class   = 1.383
t_empty   = 0.285

( 1.383 - 0.285 ) / ( 0.7415 - 0.285 ) = 2.4</description>
		<content:encoded><![CDATA[<p>Те-же данные для той-же машины и python 2.5.1</p>
<p>t_closure = 0.7415<br />
t_class   = 1.383<br />
t_empty   = 0.285</p>
<p>( 1.383 &#8211; 0.285 ) / ( 0.7415 &#8211; 0.285 ) = 2.4</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: koder</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10966</link>
		<dc:creator>koder</dc:creator>
		<pubDate>Tue, 04 Sep 2007 00:19:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10966</guid>
		<description>Я уже почти устал.

&gt; “питоновские инструкции” - это бред. хотите считать инструкции - пишите на ассемблере. питон - это язык высокого 
&gt; уровня, хотите мерять производительность....

Подавляющее большинство низкоуровневых питоновских инструкций исполняются за примерно одинаковое время
(а менно такие как add,getattr,getitem,mul,... , усли конечно соотв. операторы не перегружены python/C кодом
на что-нить нетривиальное)

Мерять такой код профайлером - мягко говоря неправильно т.к. накладные расходы профайлера ЗНАЧИТЕЛЬНО превышают время исполнения кода(что мы тут и видим). Для таких случаев давно уже есть timeit(о чем я,кстати, писал)

WinXP SP2,AthlonX2 3600@2.9Ghz

Python 3.0a1 (py3k:57844, Aug 31 2007, 16:54:27) [MSC v.1310 32 bit (Intel)] on win32
&lt;code&gt;
&gt;&gt;&gt; def closure(func):
	counter = 1
	def cl(x):
		nonlocal counter
		counter += 1
		return func(counter,x)
	return cl
&gt;&gt;&gt; class ccl:
	def __init__(self,func):
		self.func = func
		self.counter = 1
	def __call__(self,val):
		self.counter += 1
		return self.func(self.counter,val)
&gt;&gt;&gt; @closure
def f1(x,y):
	pass #мы вроде не сложение меряем а замыкания
&gt;&gt;&gt; @ccl
def f2(x,y):
	pass
&gt;&gt;&gt; def 
&gt;&gt;&gt; f1(1)
&gt;&gt;&gt; import timeit
&gt;&gt;&gt; timeit.Timer(&quot;f1(1)&quot;,&quot;from __main__ import f1&quot;).timeit()
0.70828024232130105
&gt;&gt;&gt; timeit.Timer(&quot;f2(1)&quot;,&quot;from __main__ import f2&quot;).timeit()
1.8935336753693548
&gt;&gt;&gt; def f3(x,y):pass
&gt;&gt;&gt; timeit.Timer(&quot;f3(1,1)&quot;,&quot;from __main__ import f3&quot;).timeit()
0.31531297972230732

Накладные расходы замыкания 0.708 - 0.315 = 0.392
Накладные расходы класса  1.894 - 0.315 = 1.579

С классом в 4(ЧЕТЫРЕ) раз медленнее. 
&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>Я уже почти устал.</p>
<p>&gt; “питоновские инструкции” &#8211; это бред. хотите считать инструкции &#8211; пишите на ассемблере. питон &#8211; это язык высокого<br />
&gt; уровня, хотите мерять производительность&#8230;.</p>
<p>Подавляющее большинство низкоуровневых питоновских инструкций исполняются за примерно одинаковое время<br />
(а менно такие как add,getattr,getitem,mul,&#8230; , усли конечно соотв. операторы не перегружены python/C кодом<br />
на что-нить нетривиальное)</p>
<p>Мерять такой код профайлером &#8211; мягко говоря неправильно т.к. накладные расходы профайлера ЗНАЧИТЕЛЬНО превышают время исполнения кода(что мы тут и видим). Для таких случаев давно уже есть timeit(о чем я,кстати, писал)</p>
<p>WinXP SP2,AthlonX2 <a href="mailto:3600@2.9Ghz">3600@2.9Ghz</a></p>
<p>Python 3.0a1 (py3k:57844, Aug 31 2007, 16:54:27) [MSC v.1310 32 bit (Intel)] on win32<br />
<code><br />
&gt;&gt;&gt; def closure(func):<br />
	counter = 1<br />
	def cl(x):<br />
		nonlocal counter<br />
		counter += 1<br />
		return func(counter,x)<br />
	return cl<br />
&gt;&gt;&gt; class ccl:<br />
	def __init__(self,func):<br />
		self.func = func<br />
		self.counter = 1<br />
	def __call__(self,val):<br />
		self.counter += 1<br />
		return self.func(self.counter,val)<br />
&gt;&gt;&gt; @closure<br />
def f1(x,y):<br />
	pass #мы вроде не сложение меряем а замыкания<br />
&gt;&gt;&gt; @ccl<br />
def f2(x,y):<br />
	pass<br />
&gt;&gt;&gt; def<br />
&gt;&gt;&gt; f1(1)<br />
&gt;&gt;&gt; import timeit<br />
&gt;&gt;&gt; timeit.Timer("f1(1)","from __main__ import f1").timeit()<br />
0.70828024232130105<br />
&gt;&gt;&gt; timeit.Timer("f2(1)","from __main__ import f2").timeit()<br />
1.8935336753693548<br />
&gt;&gt;&gt; def f3(x,y):pass<br />
&gt;&gt;&gt; timeit.Timer("f3(1,1)","from __main__ import f3").timeit()<br />
0.31531297972230732</p>
<p>Накладные расходы замыкания 0.708 - 0.315 = 0.392<br />
Накладные расходы класса  1.894 - 0.315 = 1.579</p>
<p>С классом в 4(ЧЕТЫРЕ) раз медленнее.<br />
</code></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Anonymous</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10964</link>
		<dc:creator>Anonymous</dc:creator>
		<pubDate>Mon, 03 Sep 2007 21:39:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10964</guid>
		<description>&lt;code&gt;http://www.python.org/dev/peps/pep-3104/ раздел Rationale, если и после этого будет “не ясно” можно написать в python-dev-request@python.org что замыкания не нужны а nonlocal так вообще нафик.&lt;/code&gt;

спасибо, что продолжаете нести бремя додумывания. у вас это хорошо получается.

в PEP&#039;е, к счастью, приведён более вменяемый пример, теперь вроде бы понятно зачем нужен nonlocal. только в том примере работа с переменной не в глобальной, и не в локальной области видимости. можно ли считать эо замыканием - не знаю. технически, наверное да. но тогда можно глобальную область видимости назвать &quot;такое большое замыкание&quot;. но это не важно, спасибо за разъяснения.

&lt;code&gt;Для 2.X скорость отличается не сильно в данном случае т.к. здесь присутствует оператор [], который трансформируется в три питоновские инструкции. Для 3.0 в этом месте нет дополнительных инструкций. Вариант через классы при каждом обращении к атрибуту требуют
двух дополнительных инструкций. Если бы счетчик не требовался то через замыкания было-бы быстрее и в 2.X.&lt;/code&gt;

сначала не хотел на это отвечать, потому что мерять &quot;питоновские инструкции&quot; - это бред. хотите считать инструкции - пишите на ассемблере. питон - это язык высокого уровня, хотите мерять производительность - берите хотя бы профайлер. сто раз это уже обмусоливалось, производительность программы зависит от алгоритмов, а не от 2 лишних инструкций.

всё-таки запустил профайлер на python3.

код f_dec стал выглядеть так:

&lt;code&gt;def f_dec(func):
	non_local = 0
	def dec(*args, **kwargs):
		nonlocal non_local
		non_local += 1
		return func(*args, **kwargs)
	return dec&lt;/code&gt;

&lt;code&gt;   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 :0(__build_class__)
      2/1    0.000    0.000   97.174   97.174 :0(exec)
        1    0.004    0.004    0.004    0.004 :0(setprofile)
      2/1   26.746   13.373   97.174   97.174 :1()
        1    0.000    0.000    0.000    0.000 :1(f_dec)
        1    0.000    0.000    0.000    0.000 :10(__init__)
  1000000   24.558    0.000   35.290    0.000 :13(__call__)
  1000000   11.193    0.000   11.193    0.000 :18(test1)
  1000000   10.733    0.000   10.733    0.000 :22(test2)
  1000000   23.946    0.000   35.138    0.000 :3(dec)
        1    0.000    0.000    0.000    0.000 :9(c_dec)
        1    0.000    0.000   97.178   97.178 profile:0(exec(&#039;..
        0    0.000             0.000          profile:0(profiler)&lt;/code&gt;

ерунда. ч.т.д.</description>
		<content:encoded><![CDATA[<p><code><a href="http://www.python.org/dev/peps/pep-3104/" rel="nofollow">http://www.python.org/dev/peps/pep-3104/</a> раздел Rationale, если и после этого будет “не ясно” можно написать в <a href="mailto:python-dev-request@python.org">python-dev-request@python.org</a> что замыкания не нужны а nonlocal так вообще нафик.</code></p>
<p>спасибо, что продолжаете нести бремя додумывания. у вас это хорошо получается.</p>
<p>в PEP&#8217;е, к счастью, приведён более вменяемый пример, теперь вроде бы понятно зачем нужен nonlocal. только в том примере работа с переменной не в глобальной, и не в локальной области видимости. можно ли считать эо замыканием &#8211; не знаю. технически, наверное да. но тогда можно глобальную область видимости назвать &#8220;такое большое замыкание&#8221;. но это не важно, спасибо за разъяснения.</p>
<p><code>Для 2.X скорость отличается не сильно в данном случае т.к. здесь присутствует оператор [], который трансформируется в три питоновские инструкции. Для 3.0 в этом месте нет дополнительных инструкций. Вариант через классы при каждом обращении к атрибуту требуют<br />
двух дополнительных инструкций. Если бы счетчик не требовался то через замыкания было-бы быстрее и в 2.X.</code></p>
<p>сначала не хотел на это отвечать, потому что мерять &#8220;питоновские инструкции&#8221; &#8211; это бред. хотите считать инструкции &#8211; пишите на ассемблере. питон &#8211; это язык высокого уровня, хотите мерять производительность &#8211; берите хотя бы профайлер. сто раз это уже обмусоливалось, производительность программы зависит от алгоритмов, а не от 2 лишних инструкций.</p>
<p>всё-таки запустил профайлер на python3.</p>
<p>код f_dec стал выглядеть так:</p>
<p><code>def f_dec(func):<br />
	non_local = 0<br />
	def dec(*args, **kwargs):<br />
		nonlocal non_local<br />
		non_local += 1<br />
		return func(*args, **kwargs)<br />
	return dec</code></p>
<p><code>   ncalls  tottime  percall  cumtime  percall filename:lineno(function)<br />
        1    0.000    0.000    0.000    0.000 :0(__build_class__)<br />
      2/1    0.000    0.000   97.174   97.174 :0(exec)<br />
        1    0.004    0.004    0.004    0.004 :0(setprofile)<br />
      2/1   26.746   13.373   97.174   97.174 :1()<br />
        1    0.000    0.000    0.000    0.000 :1(f_dec)<br />
        1    0.000    0.000    0.000    0.000 :10(__init__)<br />
  1000000   24.558    0.000   35.290    0.000 :13(__call__)<br />
  1000000   11.193    0.000   11.193    0.000 :18(test1)<br />
  1000000   10.733    0.000   10.733    0.000 :22(test2)<br />
  1000000   23.946    0.000   35.138    0.000 :3(dec)<br />
        1    0.000    0.000    0.000    0.000 :9(c_dec)<br />
        1    0.000    0.000   97.178   97.178 profile:0(exec('..<br />
        0    0.000             0.000          profile:0(profiler)</code></p>
<p>ерунда. ч.т.д.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: koder</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10961</link>
		<dc:creator>koder</dc:creator>
		<pubDate>Mon, 03 Sep 2007 15:54:01 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10961</guid>
		<description>&gt; Интересно? будет ли полноценная поддержка многомерных массивов?

Нет. Если очень нужно используйте numpy - 
там есть тип для массивов с произвольными Python объектами.
http://www.python.org/dev/peps/pep-0209/</description>
		<content:encoded><![CDATA[<p>&gt; Интересно? будет ли полноценная поддержка многомерных массивов?</p>
<p>Нет. Если очень нужно используйте numpy &#8211;<br />
там есть тип для массивов с произвольными Python объектами.<br />
<a href="http://www.python.org/dev/peps/pep-0209/" rel="nofollow">http://www.python.org/dev/peps/pep-0209/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: @spect</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10958</link>
		<dc:creator>@spect</dc:creator>
		<pubDate>Mon, 03 Sep 2007 14:01:02 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10958</guid>
		<description>Интересно? будет ли полноценная поддержка многомерных массивов?</description>
		<content:encoded><![CDATA[<p>Интересно? будет ли полноценная поддержка многомерных массивов?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: @spect</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10957</link>
		<dc:creator>@spect</dc:creator>
		<pubDate>Mon, 03 Sep 2007 14:00:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10957</guid>
		<description>Интересно? ,eltn kb gjkyjwtyyfz gjllth;rf vyjujvthys[ vfccbdjd&amp;</description>
		<content:encoded><![CDATA[<p>Интересно? ,eltn kb gjkyjwtyyfz gjllth;rf vyjujvthys[ vfccbdjd&amp;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: koder</title>
		<link>http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10955</link>
		<dc:creator>koder</dc:creator>
		<pubDate>Mon, 03 Sep 2007 11:19:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.developers.org.ua/archives/decorator/2007/09/01/python_3_0_first_alpha/#comment-10955</guid>
		<description>&gt; поэтому зачем нужны такие телодвижения не ясно

http://www.python.org/dev/peps/pep-3104/ раздел Rationale, если и после этого будет &quot;не ясно&quot;
можно написать в python-dev-request@python.org что замыкания не нужны а nonlocal так вообще нафик.

&gt; почему-то получается не в два раза быстее, а как-то.. одинаково.

Для 2.X скорость отличается не сильно в данном случае т.к. здесь присутствует оператор [],
который трансформируется в три питоновские инструкции. Для 3.0 в этом месте нет дополнительных
инструкций. Вариант через классы при каждом обращении к атрибуту требуют
двух дополнительных инструкций. Если бы счетчик не требовался то через замыкания было-бы быстрее
и в 2.X.</description>
		<content:encoded><![CDATA[<p>&gt; поэтому зачем нужны такие телодвижения не ясно</p>
<p><a href="http://www.python.org/dev/peps/pep-3104/" rel="nofollow">http://www.python.org/dev/peps/pep-3104/</a> раздел Rationale, если и после этого будет &#8220;не ясно&#8221;<br />
можно написать в <a href="mailto:python-dev-request@python.org">python-dev-request@python.org</a> что замыкания не нужны а nonlocal так вообще нафик.</p>
<p>&gt; почему-то получается не в два раза быстее, а как-то.. одинаково.</p>
<p>Для 2.X скорость отличается не сильно в данном случае т.к. здесь присутствует оператор [],<br />
который трансформируется в три питоновские инструкции. Для 3.0 в этом месте нет дополнительных<br />
инструкций. Вариант через классы при каждом обращении к атрибуту требуют<br />
двух дополнительных инструкций. Если бы счетчик не требовался то через замыкания было-бы быстрее<br />
и в 2.X.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
