2009-02-09 7 views
7

Estoy escribiendo un programa de Python con mucho acceso a archivos. Se está ejecutando sorprendentemente lento, así que utilicé cProfile para descubrir qué estaba tomando el tiempo.¿Qué es el "método incorporado adquirido" de Python? ¿Cómo puedo acelerarlo?

Parece que hay un lote de tiempo pasado en lo que Python informa como "{built-in method acquire}". No tengo idea de qué es este método. ¿Qué es y cómo puedo acelerar mi programa?

Respuesta

5

Sin ver su código, es difícil de adivinar. Pero para adivinar, diría que es el método threading.Lock.acquire. Parte de tu código está tratando de obtener un bloqueo de enhebrado, y está esperando hasta que lo tenga.

Puede haber formas simples de fijación por

  • la reestructuración de su acceso a los archivos,
  • no bloqueo,
  • mediante el bloqueo = False,
  • o incluso que no utilizan hilos en absoluto.

Pero, de nuevo, sin ver su código, es difícil de adivinar.

+0

No es el método threading.Lock.acquire. Resulta ser el método threading.Condition.acquire. Desafortunadamente, no parece haber ninguna forma de diferenciarlos en la salida del perfil. –

+1

Las dos cosas representan situaciones similares. –

0

Usar hilos para IO es una mala idea. Enhebrar no hará que su programa espere más rápido. Puede lograr mejores resultados utilizando E/S asíncronas y un bucle de eventos; Publique más información sobre su programa, y ​​por qué está usando hilos.

+0

Estoy usando subprocesos porque tengo una operación lenta de lectura de red, y necesito procesar algunos datos después de que se carguen. Con el diseño actual, puedo cargar dos conjuntos de datos, generar una clave de combinación en cada uno, fusionarlos y guardarlos. Quizás un ciclo de eventos sea mejor para eso, pero lo dudo. –

+0

-1, el enhebrado de múltiples operaciones de E/S puede ser beneficioso en python porque cada subproceso liberará el GIL mientras espera que el SO procese la solicitud. –

+0

@David: ¿Y cómo exactamente eso es mejor que usar E/S asíncronas? – nosklo

0

desea buscar la CPU utilizada, no para el "tiempo total utilizado" desde ese método, eso podría ayudar. Lo siento, no uso Python, pero así es para mí en ruby ​​:) -r

Cuestiones relacionadas