Python urllib2.urlopen () est lent, nécessite un meilleur moyen de lire plusieurs URL
Comme le suggère le titre, je suis en train de travailler sur un site écrit en python et il fait plusieurs appels à la urllib2 module pour lire les sites web. J'ai ensuite analyser avec BeautifulSoup.
Que j'ai à lire de 5 à 10 sites, la page se charge.
Je me demandais simplement si il existe un moyen de lire les sites tout à la fois? Ou anytricks pour le rendre plus rapide, comme dois-je fermer la urllib2.urlopen après chaque lecture, ou la laisser ouverte?
Ajouté: aussi, si je devais passer en php, ce serait plus rapide pour l'extraction et l'Parsi g de fichiers HTML et XML à partir d'autres sites? J'ai juste envie de charge plus rapide, par opposition à l' ~20 secondes, il faut actuellement
source d'informationauteur Jack z
Vous devez vous connecter pour publier un commentaire.
Je réécris Gars Muet de code ci-dessous, en utilisant les modules Python comme
threading
etQueue
.Meilleur moment pour
find_sequencial()
à 2s. Meilleur moment pourfetch_parallel()
est de 0,9 s.Aussi il est incorrect de dire
thread
est inutile en Python en raison de GIL. C'est un de ces cas, lorsque le thread est utile en Python parce que les threads sont bloqués sur les I/O. Comme vous pouvez le voir dans mon résultat le parallèle est 2 fois plus rapide.Edit: Veuillez jeter un oeil à Wai post pour une meilleure version de ce code. Notez qu'il n'y a rien de mal avec ce code et il fonctionnera correctementmalgré les commentaires ci-dessous.
La vitesse de lecture des pages web est probablement délimitée par votre connexion Internet, pas de Python.
Vous pouvez utiliser les threads pour les charger à la fois.
Il est maby pas parfait. Mais quand j'ai besoin de données à partir d'un site. Je viens de le faire:
En règle générale, une construction dans aucune langue n'est pas lent jusqu'à ce qu'elle est mesurée.
En Python, non seulement timings vont souvent à l'encontre de l'intuition, mais la des outils pour mesurer le temps d'exécution sont exceptionnellement bons.
Scrapy pourraient être utiles pour vous. Si vous n'avez pas besoin de toutes ses fonctionnalités, vous pouvez simplement utiliser tordu's
twisted.web.client.getPage
à la place. Asynchrone IO dans un thread va être plus performant et facile à déboguer que tout ce qui utilise plusieurs threads et de blocage IO.Ne sais pas pourquoi personne ne mentionne
multitraitement
(si quelqu'un sait pourquoi cela pourrait être une mauvaise idée, laissez-moi savoir):Il y a quelques réserves avec
multiprocessing
piscines. Tout d'abord, contrairement à des fils, ceux-ci sont complètement nouveaux Python processus (interprète). Alors il n'est pas soumis à global interprète de verrouillage, cela signifie que vous êtes limité dans ce que vous pouvez passer à travers à la nouvelle procédure.Vous ne pouvez pas passer lambdas et des fonctions qui sont définies de façon dynamique. La fonction qui est utilisée dans la
map()
appel doit être défini dans votre module d'une manière qui permet à l'autre du processus d'importation.La
Pool.map()
qui est la façon la plus simple de traiter plusieurs tâches simultanément, ne fournit pas un moyen de passer plusieurs arguments, de sorte que vous pouvez avoir besoin d'écrire des fonctions wrapper ou de modifier les signatures de la fonction, et/ou de passer plusieurs arguments dans le cadre de l'itératif qui est cartographié.Vous ne pouvez pas demander à l'enfant de processus de frayer de nouveaux. Seuls les parents peuvent engendrer des processus enfants. Cela signifie que vous devez soigneusement planifier et de référence (et parfois écrire plusieurs versions de votre code) afin de déterminer ce que l'utilisation la plus efficace des procédés.
Inconvénients malgré tout, je trouve le multitraitement pour être l'un des moyens les plus directs ne simultanées de blocage des appels. Vous pouvez également combiner le multitraitement et fils (autant que je sache, mais s'il vous plaît corrigez-moi si je me trompe), ou de combiner le traitement multiple avec des fils verts.
1) Êtes-vous d'ouvrir le même site plusieurs fois, ou de beaucoup d'autre site? Si de nombreux sites différents, je pense que urllib2 est bon. Si vous faites le même site, encore et encore, j'ai eu certains personnels de la chance avec urllib3 http://code.google.com/p/urllib3/
2) BeautifulSoup est facile à utiliser, mais est assez lent. Si vous n'avez pas à l'utiliser, assurez-vous de décomposer vos balises pour se débarrasser de fuites de mémoire.. ou il risque de mener à des problèmes de mémoire (pour moi).
Quoi faire de votre mémoire et de cpu? Si vous dépasser le maximum de votre CPU, assurez-vous que vous utilisez véritable poids lourd de threads, de sorte que vous pouvez exécuter sur plus de 1 de base.
Comment sur l'utilisation de pycurl?
Vous pouvez apt-get par
Tout d'abord, vous devriez essayer de multithreading/multitraitement paquets. Actuellement, les trois plus populaires sont multitraitement;de façon concomitante.les contrats à terme et [enfilage][3]. Ces paquets peuvent vous aider à ouvrir multi url dans le même temps, ce qui pourrait augmenter la vitesse.
Plus important, après l'utilisation de multi thread de traitement, et si vous essayez d'ouvrir des centaines d'url dans le même temps, vous trouverez urllib.demande.urlopen est très lente, d'ouverture et de lire le contexte de devenir le plus de temps. Donc, si vous voulez le rendre encore plus rapide, vous devriez essayer de demandes de paquets, les demandes.get(url).contenu() est plus rapide que urllib.demande.urlopen(url).read().
Donc, ici, je liste deux exemple pour faire rapide multi url de l'analyse, et la vitesse est plus rapide que les autres réponses.
Le premier exemple de l'utilisation classique d'enfilage de package et de générer des centaines de threads en même temps. (Un trivial inconvénient est qu'elle ne peut pas garder l'original afin de le ticker.)
Le deuxième exemple utilise le multitraitement paquet, et il est un peu plus simple. Car vous avez juste besoin de préciser le numéro de la piscine et la carte de fonction. L'ordre ne changera pas après l'extraction du contexte et de la vitesse est similaire à la première exemple, mais beaucoup plus rapide que les autres méthodes.