2012-08-15 3 views
2

j'ai écrit le script suivantconsommation de ressources Python « gamme »

Fondamentalement, je suis en train d'apprendre Python pour l'apprentissage machine et je voulais vérifier comment vraiment les tâches intensives exécuteraient. J'observe que pour 10 itérations 8 **, Python prend beaucoup de RAM (environ 3,8 Go) et aussi beaucoup de temps CPU (juste gel mon système)

Je veux savoir s'il existe un moyen de limiter le temps/la consommation de mémoire soit par code ou certains paramètres globaux

Script -

initial_start = time.clock() 
for i in range(9): 
start = time.clock() 
for j in range(10**i): 
    pass 
stop = time.clock() 
print 'Looping exp(',i,') times takes', stop - start, 'seconds' 
final_stop = time.clock() 
print 'Overall program time is',final_stop - initial_start,'seconds' 
+0

Effectuez quelque chose de calcul intensif, alors. L'itération d'une longue liste vous a-t-elle donné un aperçu? –

+0

Vous êtes surpris que quelque chose de calcul intensif utilise beaucoup de CPU? –

+0

Bonjour à tous. Merci beaucoup pour votre aide. C'était ma première question sur Stackoverflow. Mais je n'ai pas la réponse que je cherchais. Ma question est - 'Comment limiter la consommation de temps/mémoire d'un programme Python? Si je finis par exécuter un code très lourd (mauvaise programmation/données énormes, etc.), je ne veux pas qu'il baisse mon système ' – Sammy25

Répondre

2

regard sur cette question: How to limit the heap size?

Pour répondre à votre script, le module mesure timeit le temps qu'il faut pour effectuer une action plus précise

>>> import timeit 
>>> for i in range(9): 
...  print timeit.timeit(stmt='pass', number=10**i) 
... 
0.0 
0.0 
0.0 
0.0 
0.0 
0.015625 
0.0625 
0.468752861023 
2.98439407349 

Votre exemple prend la majeure partie de son temps à traiter avec les listes gigantesques de chiffres que vous mettez en mémoire. xrange au lieu de range aidera à résoudre ce problème, mais vous utilisez toujours un point de repère terrible. la boucle va s'exécuter encore et encore et ne fait réellement rien, donc le processeur est occupé à vérifier la condition et à entrer dans la boucle.

Comme vous pouvez le voir, la création de ces listes prend la majorité du temps ici

>>> timeit.timeit(stmt='range(10**7)', number=1) 
0.71875405311584473 
>>> timeit.timeit(stmt='for i in range(10**7): pass', number=1) 
1.093757152557373 
5

en Python 2, range crée une liste. Utilisez plutôt xrange. Pour une explication plus détaillée, voir Should you always favor xrange() over range()?

Notez qu'une boucle no-op for est un très mauvais point de référence qui ne vous dit pratiquement rien sur Python.

Notez également, selon le commentaire de gnibbler, range de Python 3 est fonctionne comme xrange de Python 2.

+1

notez que 'range()' dans Python3 fonctionne comme 'xrange()' depuis Python2 –

2

Python prend la RAM parce que vous créez une très grande liste de 10 ** 8 longueur avec la fonction range. C'est là que les itérateurs deviennent utiles.

Utilisez xrange au lieu de range.

Cela fonctionnera de la même façon que range mais au lieu de créer cette grande liste en mémoire, xrange calculera simplement l'index interne (en incrémentant sa valeur de 1 itération).

+0

Salut Rostyslav. Merci beaucoup pour votre aide. C'était ma première question sur Stackoverflow. Mais je n'ai pas la réponse que je cherchais. Ma question est - 'Comment limiter la consommation de temps/mémoire d'un programme Python? Si je finis par exécuter un code vraiment lourd (mauvaise programmation/énorme données, etc.), je ne veux pas que mon système bascule. – Sammy25

0

En ce qui concerne cpu, vous avez une boucle en cours d'exécution pour des milliards d'itérations sans aucune sorte de sommeil ou une pause inbetween, pas étonnant que le processus monopolise complètement le processeur (au moins sur un seul ordinateur).

1

Si vous envisagez Python pour l'apprentissage automatique, jetez un oeil à numpy. Sa philosophie consiste à implémenter toutes les "boucles internes" (opérations matricielles, algèbre linéaire) en C optimisé, et utiliser Python pour manipuler les entrées et sorties et gérer les algorithmes de haut niveau - un peu comme Matlab qui utilise Python. Cela vous donne le meilleur des deux mondes: la facilité et la lisibilité de Python, et la vitesse de C.

Pour en revenir à votre question, le benchmarking des opérations numpy vous donnera une évaluation plus réaliste des performances de Python pour l'apprentissage automatique.

Questions connexes