Comment utiliser lentement le langage informatique 2
Il existe de nombreuses façons de ralentir votre ordinateur. -Ne faites pas de copies inutiles lorsque vous travaillez avec des sous-matrices. Lorsque le langage / la bibliothèque de traitement prend en charge la notation concise du sous-tableau, au lieu de faire une copie constituée du sous-tableau, le sous-tableau lui-même doit être traité comme un argument de la fonction.
Voici un exemple de Python numpy. comme suit B = A [3: 6] ne fait pas de copie, c'est juste un alias pour le sous-tableau. Puisqu'il s'agit d'un alias, si vous modifiez l'élément de B, il passera également au tableau d'origine.
C = A [3: 6] +0 fait une copie. Par conséquent, la modification de la copie ne modifie pas la matrice d'origine. Si vous ne connaissiez pas cette différence, vous diriez: "J'avais l'intention de changer la copie, mais la séquence d'origine a changé." Cela provoquera des erreurs communes aux débutants.
>>> import numpy as np >>> A=np.arange(0,10,1) >>> A array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> A[3:6] array([3, 4, 5]) \ >>>> B = A [3: 6] # Cela ne fait pas de copie >>> B[0]=-3 >>> A array([ 0, 1, 2, -3, 4, 5, 6, 7, 8, 9]) \ >>>> C = A [3: 6] +0 # Ceci fait une copie >>> C array([-3, 4, 5]) >>> C[0]=-30 >>> A array([ 0, 1, 2, -3, 4, 5, 6, 7, 8, 9]) >>>
C'est également plus rapide si vous remplacez l'affectation par une affectation in situ. Pensez à utiliser * =, + =, - =, etc.
inplace.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
e0 = cv2.getTickCount()
a = np.ones((1024, 1024))
for i in range(20):
a = a*2
print np.sum(a[:])
e1 = cv2.getTickCount()
a = np.ones((1024, 1024))
for i in range(20):
a *= 2
print np.sum(a[:])
e2 = cv2.getTickCount()
print (e1 - e0) / cv2.getTickFrequency(), "# a = a*2"
print (e2 - e1) / cv2.getTickFrequency(), "# a *= 2"
print (e2 - e1) / (e1 - e0)
** Résultat d'exécution ** 1.09951162778e+12 1.09951162778e+12 0.116400550283 # a = a*2 0.0270198481919 # a *= 2 0.23212818261
Le temps de traitement a été réduit à 23% (4 fois plus rapide).
** Résumé ** ・ Ne faites pas de copie dans le tableau partiel ・ N'utilisez pas "* =" lorsque "* =" est suffisant.
Pour Python, "Python hautes performances" Vous devriez lire.
Recommended Posts