[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