Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

877
Visualizações
¿Qué hace la función delay() (cuando se usa con joblib en Python)

He leído la documentación , pero no entiendo qué significa: The delayed function is a simple trick to be able to create a tuple (function, args, kwargs) with a function-call syntax.

Lo estoy usando para iterar sobre la lista en la que quiero operar (allImages) de la siguiente manera:

 def joblib_loop(): Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages)

Esto devuelve mis funciones HOG, como quiero (y con la ganancia de velocidad usando todos mis 8 núcleos), pero no estoy seguro de lo que realmente está haciendo.

Mi conocimiento de Python está bien en el mejor de los casos, y es muy posible que me esté perdiendo algo básico. Cualquier puntero en la dirección correcta sería muy apreciado.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Quizá las cosas se aclaren si nos fijamos en lo que sucedería si, en cambio, simplemente escribiésemos

 Parallel(n_jobs=8)(getHog(i) for i in allImages)

que, en este contexto, podría expresarse de manera más natural como:

  1. Crear una instancia Parallel con n_jobs=8
  2. crea la lista [getHog(i) for i in allImages]
  3. pasar esa lista a la instancia Parallel

¿Cuál es el problema? En el momento en que la lista pasa al objeto Parallel , todas getHog(i) ya han regresado, ¡así que no queda nada para ejecutar en Parallel! Todo el trabajo ya estaba hecho en el hilo principal, secuencialmente.

Lo que realmente queremos es decirle a Python qué funciones queremos llamar con qué argumentos, sin llamarlas realmente ; en otras palabras, queremos retrasar la ejecución.

Esto es lo que nos permite convenientemente delayed , con una sintaxis clara. Si queremos decirle a Python que nos gustaría llamar a foo(2, g=3) en algún momento posterior, simplemente podemos escribir delayed(foo)(2, g=3) . Se devuelve la tupla (foo, [2], {g: 3}) , que contiene:

  • una referencia a la función que queremos llamar, por ejemplo, foo
  • todos los argumentos ("args" cortos) sin una palabra clave, por ejemplo, 2
  • todos los argumentos de palabras clave (abreviatura de "kwargs"), por ejemplo, g=3

Entonces, al escribir Parallel(n_jobs=8)(delayed(getHog)(i) for i in allImages) , en lugar de la secuencia anterior, ahora sucede lo siguiente:

  1. Se crea una instancia Parallel con n_jobs=8

  2. La lista

     [delayed(getHog)(i) for i in allImages]

    se crea, evaluando a

     [(getHog, [img1], {}), (getHog, [img2], {}), ... ]
  3. Esa lista se pasa a la instancia Parallel .

  4. La instancia de Parallel crea 8 subprocesos y les distribuye las tuplas de la lista

  5. Finalmente, cada uno de esos subprocesos comienza a ejecutar las tuplas, es decir, llaman al primer elemento con el segundo y el tercer elementos desempaquetados como argumentos tup[0](*tup[1], **tup[2]) , convirtiendo la tupla volvamos a la llamada que realmente pretendíamos hacer, getHog(img2) .

over 4 years ago · Santiago Trujillo Relatório

0

necesitamos un bucle para probar una lista de diferentes configuraciones de modelos. Esta es la función principal que impulsa el proceso de búsqueda de cuadrícula y llamará a la función score_model() para cada configuración de modelo. Podemos acelerar drásticamente el proceso de búsqueda de cuadrículas evaluando las configuraciones del modelo en paralelo. Una forma de hacerlo es usar la biblioteca Joblib. Podemos definir un objeto paralelo con la cantidad de núcleos a usar y configurarlo con la cantidad de puntajes detectados en su hardware.

definir ejecutor

executor = Parallel(n_jobs=cpu_count(), backend= 'multiprocessing' )

luego cree una lista de tareas para ejecutar en paralelo, que será una llamada a la función score model() para cada configuración de modelo que tengamos.

supongamos def score_model(data, n_test, cfg): ........................

definir lista de tareas

tasks = (delayed(score_model)(data, n_test, cfg) for cfg in cfg_list)

podemos usar el objeto Parallel para ejecutar la lista de tareas en paralelo.

scores = executor(tasks)

over 4 years ago · Santiago Trujillo Relatório

0

Entonces, lo que desea poder hacer es acumular un conjunto de llamadas a funciones y sus argumentos de tal manera que pueda pasarlos de manera eficiente a un programador/ejecutor. Delayed es un decorador que toma una función y sus argumentos y los envuelve en un objeto que se puede poner en una lista y sacar según sea necesario. Dask tiene lo mismo que usa en parte para alimentar su programador de gráficos.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda