[pyar] i+=1 vs i=i+1

Claudio Freire klaussfreire en gmail.com
Vie Mayo 4 22:07:04 ART 2012


On Fri, May 4, 2012 at 7:55 PM, Facundo Batista
<facundobatista en gmail.com> wrote:
>> CPython optimiza el caso:
>>
>> buf = ""
>> buf += ...
>> buf += ...
>> for bla in bla:
>>   buf += blah
>> ETc
>
> ¿En qué sentido lo optimiza?

Convierte:

buf = algo
buf += otro

A:

buf = PyString_FromString(algo)
buf_len = PyString_Length(buf)
otro_len = PyString_Length(otro)
PyString_Resize(&buf, buf_len+otro_len)
memcpy(PyString_AS_STRING(buf) + buf_len, PyString_AS_STRING(otro), otro_len)

Como PyString_Length() es O(1) y PyString_Resize es O(1) amortizado, y
ese memcpy es O(otro_len), la aplicación repetida de ese patrón para
conseguir una cadena final de N caracteres termina siendo O(N)
amortizado, mientras que la implementación "ingénua" de CPython en
otras condiciones (ej: si "buf" es un atributo en una instancia o
tiene otras referencias en otros lados no funciona la opcimización) o
la implementación de Jython son O(N²).



More information about the pyar mailing list