Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: reconFito en 14 Enero 2020, 03:34 am



Título: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 14 Enero 2020, 03:34 am
Básicamente se trata de una guía telefónica, la cual tiene ser construida usando diccionarios esa es la restricción, en la cual se puede realizar una búsqueda por  el nombre de la persona y luego imprimir ese nombre con su respectivo número.

PERO TODO INDICA QUE LE FALTA UNA MEJOR OPTIMIZACIÓN.


Gracias por sus respuestas.

Código
  1.    def phone_book():
  2.        n = int(input())
  3.        phone_book = {}  # dictionary
  4.        for i in range(n):
  5.            string = input().split()
  6.            phone_book.update({string[0]: int(string[1])})
  7.        return phone_book
  8.  
  9.    # processing
  10.    def query(phone_book):
  11.        i = 0
  12.        while i < len(phone_book):
  13.            _query = input()
  14.            if _query in phone_book:
  15.                print(f"{_query}={phone_book[_query]}")
  16.            else:
  17.                print("Not found")
  18.            i += 1
  19.    query(phone_book())
  20.  
  21. [/


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 14 Enero 2020, 05:14 am
Código:
[code=python]def query(phone_book):
    for i in range(len(phone_book)):
        _query = input()

no entiendo la cantidad de ciclos alli

el primero... estás haciendo un query, entonces para que repetirlo tanto como numeros de telefonos haya? solo lo necesitas hacer una vez y listo...

luego aqui
Código
  1. if _query in phone_book:
  2.            for key in phone_book:
  3.                if _query == key:
  4.                    print(f"{key}={phone_book[key]}")
  5.        else:
  6.            print("Not found")
no entiendo que hace el ciclo, es decir si query está en el phone_book, tan simple como que lo puedes acceder, no tienes que recorrer el diccionario, ese es el punto de los mismos...

con correcciones quedaría según mi estilo

Código
  1. def phone_book():
  2.    n = int(input("indica cuantos numeros vas a ingresar: ")) # 1*
  3.    phone_book = {}
  4.    for i in range(n):
  5.        buff = input("ingresa el nombre un espacio y el numero: ") # 2*
  6.        nombre, numero = buff.split(" ", 1) # 3*
  7.        phone_book[nombre] = numero # 4*
  8.    return phone_book
  9.  
  10. def query(phone_book):
  11.    _query = input("ingresa el nombre a buscar: ")
  12.    if _query in phone_book:
  13.         print(f"{_query}={phone_book[_query]}") # 5*
  14.    else:
  15.         print("Not found")
  16.  
  17. query(phone_book())


1* importante saber que pides
2* cuidado con usar palabras reservadas, no te vaya a traer errores mas adelante
3* aunque parezca redundante ayuda a dejar claro y visible lo que pasa
4* ya que no estás fusionando 2 diccionarios si no agregando un solo elemento, no es necesario usar update con un diccionario temporal
5* cuidado con la impresion de formato, esto es apropiado para debug pero puede traerte problemas en un sistema de produccion
[/code]


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: @XSStringManolo en 14 Enero 2020, 08:09 am
Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)

while --n:

Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.

Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 14 Enero 2020, 08:13 am
Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)

while --n:

Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.

Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.


insisto... los while a nivel de compilador son básicamente lo mismo, incluso si tuvieran 3 o 4 instrucciones extra es irrelevante incluso ante una suma...

por otro lado, mira el tema y el código para tirar de cosas como esas librerias... es decir, virtualmente no creo que sea si quiera posible aplicarlas aqui... estamos hablando de un problema de algoritmia, no de limitacion de sistema

por otro lado en python es preferible que uses el for para navegar los array ya que en el interprete se hace a bajo nivel en comparacion con tu accesandolo por ciclo


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 00:43 am
Obtuve un buen resultado usando el bucle while en la busqueda.
Pero parece que aun le falta más optimización


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 00:45 am
insisto... ni si quiera se para que haces una busqueda... :s es decir, tienes que obligatoriamente hacer una busqueda con un ciclo? porque python la hace por ti...


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 01:10 am
Si tengo que usar un ciclo ya que la cantidad de busquedas es igual a la longitud del diccionario.
Es una práctica de HackerRank, con el ciclo while logre componer un error de compilación ahora obtengo un
Runtime Error y busque en san google y encontre que es por falta de optimización pero no se que más hacerle.


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 01:39 am
estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...

y runtime error es un error generico que no recuerdo que python muestre,  python da errores muy detallados tipo

Código:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

que interprete de pyhton usas?

como dice exactamente el problema que resuelves?


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 01:42 am
¿Que está?


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 01:50 am
disculpa, estaba escribiendo y se mandó el mensaje... aqui completo

estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...

y runtime error es un error generico que no recuerdo que python muestre,  python da errores muy detallados tipo

Código:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

que interprete de pyhton usas?

como dice exactamente el problema que resuelves?


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 02:01 am
Perdón no me especifique bien ese ejercicio lo estoy haciendo en la página de HackerRank y ese error lo tira el interprete dcha página.
El RuntimeError se da cuando al diccionario se le añade un total de 100000 datos y se luego se hace una busqueda de igual magnitud.El script que hice le toma mucho tiempo en realizar la busqueda y no pasa la prueba.


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 02:08 am
para ver tu codigo y el enunciado exacto del problema


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 03:06 am
Task
Given n names and phone numbers, assemble a phone book that maps friends' names to their respective phone numbers. You will then be given an unknown number of names to query your phone book for. For each name queried, print the associated entry from your phone book on a new line in the form name=phoneNumber; if an entry for name is not found, print Not found instead.

Note: Your phone book should be a Dictionary/Map/HashMap data structure.




Aqui ya inicialice algunas variables pero aun sigue el error

Código
  1. def phone_book():
  2.    n = int(input())
  3.    phone_book = {}  # dictionary
  4.    for i in range(n):
  5.        string = input().split()
  6.        phone_book.update({string[0]: int(string[1])})
  7.    return phone_book
  8. # processing
  9. def query(phone_book):
  10.    i = 0
  11.    _query = ""
  12.    lenght = len(phone_book)
  13.    for i in range(lenght):
  14.        _query = input()
  15.        if _query in phone_book:
  16.            print("{0}={1}".format(_query, phone_book[_query]))
  17.        else:
  18.            print("Not found")
  19. query(phone_book())
  20.  
  21.  


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 03:12 am
estoy viendo a pagina... y no, ignora el runtime error... runtime error simplemente significa "error en tiempo de ejecucion" es decir que tu error no está intrinseco en tu codigo, sino en tu logica, y ese error en python de nada sirve

bajo ese error debe estar la salida exacta del error

 ejemplo

(https://i.imgur.com/QFUDXRl.png)


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 03:38 am
A mi simplemente me sale
Compiler Message:
RuntimeError

Input (stdin)
10000
Lista de todos  los datos que se ingresaron

Expected output
Lista de todos los datos buscados


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: engel lex en 15 Enero 2020, 03:50 am
no creo que sea por exceso de tiempo, ya que acabo de intentar algo que tarde mucho y da

(https://i.imgur.com/zTv1QZs.png)

hay algo fallando en otro lugar... el resto de tus test cases son exitosos?


Título: Re: [Python3]¿Cómo lo puedo optimizar?
Publicado por: reconFito en 15 Enero 2020, 04:01 am
Asi es pero no entiendo porque al primer intento salen todos los casos bien y luego se queda cargando y falla el primer caso