自学一直有一个困扰(因为教程里不太会提及这种问题)
比如一些简单的函数或方法,如 len()
、isdigit()
多次使用的情况下
string = 'something'
if len(string) == 1:
pass
elif len(string) == 2:
pass
是否需要定义一个临时的变量
string = 'something'
length = len(string)
if len(length) == 1:
pass
elif len(length) == 2:
pass
这样变量多了一个,但是函数少计算一次
哪一种益处更大呢?
-是所有此类情况都用临时变量呢?
-还是具体函数具体分析,简单的不需要临时变量?
从资源合理利用的角度,怎么权衡这两种方案
Parlons d'abord de la conclusion :
Permettez-moi de répondre brièvement à votre question sous deux aspects
Tout d'abord, lorsque l'efficacité n'est pas au cœur du programme actuel, la recherche de la lisibilité devrait être le principe le plus élevé
Comment dire ?
Certains problèmes de programmes et de traitement de code ne sont pas des problèmes de vitesse. Par exemple, par rapport à un simple programme de facturation par rapport aux calculs scientifiques, il n'est pas très significatif de poursuivre spécifiquement l'optimisation de la vitesse d'exécution. la recherche Pour des programmes efficaces, cela ne signifie pas nécessairement que le code sur lequel vous vous concentrez actuellement est la clé de l'efficacité (le profilage est nécessaire pour vraiment déterminer, et une optimisation prématurée n'est pas une bonne idée). Le fait est que s'il n'y a pas de problème de performances et que vous avez déterminé qu'il est causé par ce segment de code, il n'est pas nécessaire de trop considérer les ressources ou les performances, surtout maintenant que l'espace et la vitesse de calcul des machines se sont tellement améliorés. , certains appels de fonction ne sont rien du tout, sinon oop et certaines techniques d'abstraction ne seront plus disponibles.
La recherche de la lisibilité est donc généralement un meilleur objectif. Bien sûr, cette partie dépend de la situation. Par exemple, le livre Refactoring mentionne la méthode de remplacement de Temp par Query, en raison des variables régionales qui peuvent être apportées. code difficile à extraire. Mais ce n’est pas toujours le cas. Parfois, des formules de requête trop longues peuvent rendre le code difficile à lire. Bref, cette partie peut être réfléchie et opportune.
La deuxième partie peut analyser l'efficacité. Dans le cas de
len
, je choisirai de ne pas définir une autre variable, car Python a sa structure de données intégrée, et la fonctionlen
l'extrairea directement du correspondant C -L'attribut de longueur des données renvoyées dans Object, donc cette partie est très rapide, ce que je veux dire, c'est que Python lui-même enregistre les informations de longueur pour ses propres données intégrées. L'utilisation delen
ne provoquera pas de calculs supplémentaires ou cela. Il s'agit d'un appel en cascade, il n'est donc pas nécessaire de prendre en compte les problèmes d'efficacité.De plus,
len
est très lisible et la longueur de la fonction est très courte. Il n'est pas nécessaire de définir une nouvelle variable.P.S. Si j'ai mal compris, n'hésitez pas à me corriger, merci
Du point de vue des performances, cette situation nécessite des variables temporaires. Il est recommandé de développer de bonnes habitudes. Il n'y a aucun mal à utiliser davantage de variables temporaires
.Tout d'abord, corrigez le programme. Dans la deuxième version,
len()
il ne doit être utilisé qu'une seule fois. Les variables temporaires doivent également recevoir des noms significatifs.Je ne sais pas si vous avez une notion de complexité temporelle. La complexité temporelle de certains algorithmes est O(N). En d'autres termes, si votre chaîne comporte n éléments, votre programme doit passer par n étapes pour y parvenir. l'objectif, si vous devez utiliser cet algorithme m fois dans le futur, alors la complexité temporelle de votre programme prendra au moins n*m étapes.
Si vous utilisez une variable temporaire pour enregistrer cet algorithme, alors la complexité temporelle de la recherche de la valeur ne sera que de O(1), c'est-à-dire que la complexité totale de votre programme est réduite de O(n*m). ) à O(n m), si
n <= m
, la complexité temporelle de votre programme est réduite de l'original O(N^2) à O(N).Je ne suis pas d'accord avec l'idée d'utiliser plus de variables temporaires. Si la fréquence des variables temporaires dans le programme est
La complexité temporelle du programme a-t-elle été considérablement réduite ?
Est-ce que cela permet aux autres de comprendre plus facilement vos intentions ?
Le code peut-il paraître plus concis ?
Ce problème est généralement adapté aux conditions locales. S'il n'y a que deux jugements, il n'est pas nécessaire de définir des variables. Après tout, il est difficile de maintenir trop de variables. En ce qui concerne votre longueur, s'il y a plusieurs jugements, vous pouvez utiliser un cas de commutation et passer directement la méthode len() en tant que paramètre, et mettre l'option la plus probable en premier. Je n'ai jamais appris Python, mais je pense qu'il devrait y avoir une méthode de changement de cas. D'après mon expérience, définissez le moins possible les variables temporaires. Au fil du temps, la gestion des variables sera difficile. Bien entendu, des variables sont nécessaires à certains endroits, comme dans une boucle for. Définir une variable temporaire pour stocker la longueur du tableau améliorera les performances. Bref, tout doit être basé sur la réalité. Lorsque les variables temporaires peuvent grandement améliorer la lisibilité et la maintenabilité du code actuel, elles sont nécessaires. Sinon, ce n'est pas défini.