Il existe un moyen de l'utiliser tardivement dans n'importe quelle langue. J'ai utilisé la méthode pour l'utiliser tardivement Il est facile de dire: «La langue XX, la bibliothèque est lente». Voici certaines choses que les débutants ont tendance à faire.
-Pour ajouter un élément de liste, le résultat de la concaténation à la liste avec l'opérateur + est affecté à la liste.
ex.py
a = []
for i in range(1000):
a = a + [i]
・ Malgré le fait qu'il existe une méthode efficace pour ajouter la liste à la liste Il répète l'ajout d'éléments individuels. (Dans le cas de python, il existe une méthode d'extension.)
・ Lorsque la structure de données n'est pas correctement utilisée conformément à l'objectif Les listes sont utilisées pour un traitement suffisant dans les dictionnaires et les ensembles. C'est O (N) pour s'assurer que la liste contient des valeurs if x in listData: S'il est inclus dans la clé du dictionnaire est O (1) if dictData.has_key(x): S'il est inclus dans l'ensemble est O (1) if x in setData:
・ Sans remarquer qu'il peut être exécuté efficacement en utilisant les fonctions incluses dans la bibliothèque standard. Je fais une implémentation lente avec ma propre bibliothèque.
Dans une bibliothèque qui fournit un format de données appelé ensemble, recherchez la fusion, la partie commune et la différence de l'ensemble. Une méthode est fournie. Pour le type d'ensemble Python s.union(t) s.intersection(t) s.difference(t)
Avec eux, vous vous retrouverez probablement avec un programme concis qui s'exécute plus rapidement que votre propre bibliothèque. Je vais.
-Faites une copie d'un objet inutile. Exemple: Un langage / bibliothèque qui permet aux sous-tableaux d'être décrits de manière concise et passés comme arguments sans faire de copie. Malgré cela, je fais une copie et je la remets. En C ++, le type OpenCV cv :: Mat peut passer une image partielle comme argument de fonction. Le type de tableau Numpy de Python peut également passer un sous-tableau comme argument de fonction.
Exemple: en C ++, vous pouvez passer par référence, mais vous passez par valeur, Faites une copie d'un objet inutile. (Un programme de texte insuffisant est suffisant pour enseigner uniquement le passage par valeur et le passage par pointeur en C ++.)
・ Malgré le fait que la bibliothèque est conçue pour effectuer efficacement des calculs matriciels Dans une telle bibliothèque, les opérations matricielles sont traitées dans une boucle d'instructions for. (MATLAB, python numpy, etc.)
ex2.py
# -*- coding: utf-8 -*-
def func1():
b=['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's']
for i in range(10000):
a=['a', 'b', 'c']
for x in b:
a= a+[x]
# print a
def func2():
b=['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's']
for i in range(10000):
a=['a', 'b', 'c']
for x in b:
a.append(x)
# print a
def func3():
b=['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's']
for i in range(10000):
a=['a', 'b', 'c']
a = a+b
# print a
def func4():
b=['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's']
for i in range(10000):
a=['a', 'b', 'c']
a.extend(b)
# print a
if __name__=='__main__':
func1()
func2()
func3()
func4()
Dans le cas de Python, vous pouvez prendre un profil sans réécrire le script en utilisant [Exécuter] [Profil] dans l'environnement intégré de Spyder.
Résumé: Utilisez les méthodes append et extend pour ajouter des données à la liste. Ce n'est pas une bonne idée de répéter l'affectation à l'aide de l'opérateur +. Utilisez différentes structures de données telles que des listes, des dictionnaires et des ensembles. Utilisez les méthodes de structure de données présentes dans les bibliothèques standard et évitez de créer vous-même des fonctionnalités équivalentes. Ne faites pas de copies inutiles des données. N'utilisez pas les boucles for qui peuvent être exécutées sans boucles for dans les opérations de tableau.
Post-scriptum: Si vous souhaitez en savoir plus sur ces contenus, "Python hautes performances" Vous devriez lire. Au moment de la rédaction de cet article, cette traduction japonaise n'avait pas été publiée.
Informations de référence Comparaison de vitesse pour l'ajout de listes Python (ajout, notation d'inclusion, etc.) http://nonbiri-tereka.hatenablog.com/entry/2014/10/20/110304
Recommended Posts