[pyar] ¿Volvemos a empezar?
Roberto Alsina
ralsina en netmanagers.com.ar
Mie Abr 30 22:43:15 ART 2014
On 30/04/14 22:37, Fernando Pelliccioni wrote:
>
>
>
> 2014-04-30 21:45 GMT-03:00 Roberto Alsina <ralsina en netmanagers.com.ar
> <mailto:ralsina en netmanagers.com.ar>>:
>
> On 30/04/14 21:37, Fernando Pelliccioni wrote:
>>
>>> Ahora, que "conozco" algo sobre la semantica de Slice.
>>> ¿Que implica, a nivel complejidad, hacer lo siguiente?
>>>
>>> s == s[::-1]
>>>
>>> Donde s es una secuencia (o un tipo "Slice-able").
>>>
>>
>> Depende.
>>
>>
>>> Por las dudas claro:
>>> Se la respuesta, lo pregunto para que veamos si podemos
>>> mejorar el algoritmo)
>>
>> No, no creo que la sepas :-)
>> La complejidad es la que sea que tenga s.__getitem__
>>
>>
>> Tengo que leer todavia el link que me pasaste acerca de s.__getitem__
>> Bueno, en realidad me refería a suponer el peor de los casos.
>
> Infinita.
>
> class X(object):
> def __getitem__(self, *a, **kw):
> while True:
> pass
>
>
> Vos podés calcular la complejidad del algoritmo a pesar de casos con
> side-effects como estos.
> Para no concentrarnos en estas cosas por ahora, entonces, digamos que
> vamos a operar con las secuencias built-in de Python.
No, no podés. Pero bueno, como decís vamos a las secuencias built-in.
¿Cual? Porque no es lo mismo una lista que un string.
>
>
> ¿En el mejor de los casos? Constante:
>
> >>> class X(object):
> ... def __getitem__(self, *a, **kw):
> ... return 42
> ...
> >>> x=X()
> >>> x[1:34]
> 42
>
>
> Por mas que __getitem__ sea constant-time no modifica la complejidad
> de mi algoritmo, ejemplo
>
> # Pseudo-Codigo, no se exasperen, se que no es el estilo de
> programacion usado en python, es un ejemplo
> sum = 0
> x = X() # x es del tipo X
> for ( i from 0 to size(x) )
> sum = sum + x[i] # x[i] es constant
> time, y retorna siempre 42
>
> Cual es la complejidad de mi algoritmo?
>
Es que ahí estás calculando la complejidad de ese loop, no de lo que
hace __getitem__ que es lo que hacía tu ejemplo anterior.
Cuando haces un slice, lo que hacés es una simple llamada a __getitem__.
La complejidad de __getitem__ es arbitraria, depende de la clase.
>
>
>
>> Suponiendo el peor de los casos, que significa hacer? ( no solo
>> complejidad asintótica, sino, operaciones concretas )
>>> s == s[::-1]
>>
>> La respondo yo.
>>
>> En el peor de los casos:
>> 1. Para s[::-1]
>> - Memory allocation para la nueva secuencia,
>> ya que como vimos antes, no podemos asegurar que id(s) == id(s[::-1])
>> - Cargar la nueva lista con las referencias de
>> la lista original
>
> En general si, van a ser distintas. No veo como podrían ser la
> misma en el caso general. Claro, si fuera una lista podrías
> reordenarla in-place.
>
>
>
>>
>> 2. Para la comparacion de igualdad ==
>> - Iterar sobre la secuencia, realizando...
>> - N comparaciones
>>
>
> Supongo.
>
>
>> ¿Es necesaria esta complejidad para un algoritmo de palindromos?
>> (no perder de vista que tengo en mente otra cosa)
>> ¿Es el optimizer tan inteligente para darse cuenta de esto?
>> ¿seguro? ¿como lo podemos verificar?
>
> En todo esto estás abstrayéndote de qué es s. En un lenguaje
> dinámico, eso es lo más importante. Si decís "s es de clase str"
> es otra cosa.
> pero estás tratando todo en abstracto. Si s es "un iterable"
> entonces imaginate que pasa si es de la clase X que puse arriba.
>
>
>
> En C++, que no es un lenguaje dinamico, los algoritmos son programados
> usando programacion generica, donde también abstraerse del tipo
> concreto es lo mas importante.
> En programacion generica (Python es un lenguaje que soporta
> perfectamente el paradigma), el algoritmo es el que debe imponer
> (implicita o explicitamente) la sintaxis y la semantica a los tipos.
> Las imposiciones se pueden hacer usando sintaxis del lenguaje (si el
> lenguaje esta preparado) o bien especificandolas en forma de
> documentacion.
>
Ok, no tengo ganas de discutir. Como vos quieras. Si para vos la
complejidad de s[::-1] no depende de la implementación de s.__getitem__
simplemente no tenemos un terreno en común para charlar.
> Ejemplo:
>
> #Pseudo python
> def palindrome( s ) requires s is NonSideEffectsIterable
> # ...
>
> Donde en este hipotetico lenguaje, NonSideEffectsIterablees una
> especializacion de Iterable que define que __getitem__ debe terminar y
> no tener side-effects (supongamos)
>
> Entonces, solo puedo usar mi algoritmo palindrome con tipos acordes a
> la especificacion del mismo.
> Si intento usarlo con tipos no soportados, bueno, si el lenguaje fuera
> estatido, daria un error de compilacion, sino, imagino, algun runtime
> error.
>
> No quería llegar tan lejos todavía. Me obligaste :)
Y si mi abuela tuviera ruedas, sería bicicleta. Si querés discutir lo
que haría un hipotético algoritmo en un hipotético lenguage... no
gracias :-)
>
>>
>> (Para el mejor de los casos tendría que explorar la semántica de
>> s == s, que me estimo que luego de ser optimizado es NO-OP.)
>>
>>
>> Ahora, realmente no quiero seguir rompiendo las bolas si estos
>> temas no interesan en la lista o piensan que no son importantes.
>> Podemos someterlo a votación o puedo seguir y cada cual es libre
>> de leer u omitir.
>
>
> No empecemos otro thread infinito acerca de la votación :-)
>
>
> Entonces sigo? O estoy siendo denso?
Seguí lo que quieras, pero a mí se me fueron las ganas de continuarla.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140430/2ed53be8/attachment.html>
More information about the pyar
mailing list