• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

URLLIB - Rapidez de execução

13 mensagens neste tópico

Estou a usar o módulo urllib para sacar umas informações de uns links. O processo é um bocado lento, demorando cerca de 2 segundos por link. Não há maneira de melhorar a performance?

EDIT: Eu sei que o problema é provavelmente do tempo de resposta do servidor, estou a perguntar só por perguntar...

O código que estou a usar é este:

# Retrieving Abstract

abstract = {}
index = 1

import urllib
proxies = {'http': '*******************'}

abstract = []

for index in range(0, len(links), 2):
    # Gets link info
    abstract_link = urllib.urlopen(links[index], proxies = proxies)
    # Send to a list
    abstract_page = str(abstract_link.readlines())
    # REGEX to search the borders
    p = re.compile('<p class="abstract">')
    q = re.compile('<p class="pmid">')
    k = p.search(abstract_page)
    l = q.search(abstract_page)
    m = k.end()
    n = l.start()
    zz = abstract_page[m:n]
    xx = re.compile('</p>')
    zz = xx.sub('', zz)
    abstract.append(str(zz))
    

new_file_path = '****************.abstract.txt'
open_new = open(new_file_path, 'w')

for index in range(len(abstract)):
    open_new.write(abstract[index]+'\n\n')
open_new.close()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

I have to ;)

EDIT: Pelo menos no sitio onde o estou a desenvolver. Cá fora não preciso, mas a velocidade não aumenta por isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então não estou aí a ver isto que possa diminuir a performance:

abstract_page = str(abstract_link.readlines())

Mete:

abstract_page = abstract_link.read()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma vez falei em multi-threading lá no laboratório. Resposta "Tu, esquece isso!"

E isso não é apenas para processadores com mais do que um núcleo? Adianta usar isso em processadores normais? E onde aplicaria isso? Ao fim ao cabo, só precisava de "optimizar" um comando: o "retrieval" da página.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Multi-threading neste caso iria adiantar pouco pedrotuga. Quantos links são anaryin?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

multithreading ia adiantar tudo djthyrax. Realizar tarefas triviais sequencialmente é uma estrategia pobre, principalmente num caso como este em que se tem que esperar por uma resposta num sistema remoto e essa resposta demora qualquer coisa na ordem dos milhares de vezes mais tempo.

Este é de resto o exemplo típico que é usado para ilustrar o uso de threads.

Anaryin, não sei quem foi essa pessoa que te disse isso mas disse-te uma valente calinada. Em primeiro lugar uma thread não é um processo e um processo não é uma aplicação. Depois os sistemas operativos que usamos e os procesoadores que são usados nos computadores actualmente suportam perfeitamente vários processos.

Tipo... isso é uma valente calinada mesmo.

Isto até eu que sou um analfabeto em sistemas operativos, sei.

Para alem disso em python abrir threads concorrentes é uma brincadeira de crianças.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pedrotuga, multi threading para 2 links não ia valer a pena, só o ter de abrir outro processo, ias perder mais tempo que esperares pela resposta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pedrotuga, multi threading para 2 links não ia valer a pena, só o ter de abrir outro processo, ias perder mais tempo que esperares pela resposta.

Criar uma nova thread é bem menos custoso que criar um novo processo. Mesmo assim, é provável que não traga ganhos significativos.

EDIT: onde é que diz que só são dois links?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tambem não vi em lado nenhum a dizer que são dois links.

Se forem dois link tambem não vejo qual é a sangria de acelerar a execução disto se demora 4 segundos e na verdade não há grande coisa a fazer em relação a tempo de resposta do servidor.

Criar uma thread em python é a cois amais facil do mundo, é herdar a classe de threading e extende-la com a tarefa em questão, neste caso um pedido http.

Os ganhos são absolutamente significativos. Os pedidos sao feitos em paralelo em vez de sequencialmente. Em 50 links pode passar-se de quase dois minutos para menos de 10 segundos. Isto não sendo lambao em relação à abertura de threads, que neste caso não estou a ver grande problema em abrir threads um pouco à bruta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT: onde é que diz que só são dois links?

Foi um exemplo que dei, para ilustrar a ideia de que para poucos links, não compensa. Claro está, para 12345678901 links, é mais que óbvio que compensa.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele aqui vai abrir quantos links o utilizador pedir ao fim ao cabo, mas só abre um de cada vez. Posso sempre colocar vários ciclos e abrir vários links para poder tirar partir do multi-threading. Acham que vale a pena? (Ou então abro directamente cada link em cada thread, até um certo limite)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora