2013-01-31 6 views
0

En python, si j'ai une fonction récursive qui modifie une liste d'entiers, et suppose que la liste est grande, ce qui est plus rapide à faire: garder la liste comme variable globale, et ne pas la passer comme argument comme un argument et ne le rend pas global?Quoi de plus rapide, de récursivité ou de variables globales?

+2

Pouvez-vous montrer la fonction? – mgilson

+3

En cas de doute, chronométrez avec 'timeit'. –

+0

Avez-vous essayé de profiler les deux? –

Répondre

-1

Les listes sont transmises par adresse, donc un surcoût supplémentaire est juste un paramètre de fonction unique (pointeur). Je ne pense pas que ce soit perceptible.

Vous devez vous tester, mais je serais surpris si ce serait important.

+0

Python passe les références par valeur pour * tout * de toute façon (ex: il n'y a pas de valeur par défaut en Python) – NullUserException

+0

Passer des types immuables finit par ressembler à une valeur de transfert, puisque les changements effectués dans la fonction n'affectent pas la valeur dans l'appelant. – PaulMcG

+0

@PaulMcGuire Eh bien, quand vous avez un type immuable, vous * ne pouvez pas * apporter des modifications à l'objet par définition. Je suppose que le comportement que vous décrivez est quelque chose comme 'def fun (x): x = '. Dans ce cas, le résultat est le même que l'objet soit mutable ou non. – NullUserException

1

Pour un code rapide et propre, vous devez utiliser une approche itérative de la récursivité (dans la mesure où il n'y a pas d'alternative algorithmique) avec une pile personnalisée, au lieu de globales.

0

Si la liste est transmise par référence et non dupliquée dans la fonction récursive, alors la différence de performance sera négligeable, et vous devrez utiliser n'importe quelle méthode pour obtenir un code plus clair et plus maintenable. Habituellement, cela passerait le tableau en paramètre, mais pas toujours.

Questions connexes