Très bien, j'ai fait ce travail récemment (ne vous inquiétez pas, je l'ai déjà fait, mais en C++) mais je me suis demandé comment je pourrais le faire en python. Le problème est d'environ 2 sources de lumière qui émettent de la lumière. Je ne vais pas entrer dans les détails.Problème d'optimisation Python?
Voici le code (que j'ai réussi à optimiser un peu dans la dernière partie):
import math, array
import numpy as np
from PIL import Image
size = (800,800)
width, height = size
s1x = width * 1./8
s1y = height * 1./8
s2x = width * 7./8
s2y = height * 7./8
r,g,b = (255,255,255)
arr = np.zeros((width,height,3))
hy = math.hypot
print 'computing distances (%s by %s)'%size,
for i in xrange(width):
if i%(width/10)==0:
print i,
if i%20==0:
print '.',
for j in xrange(height):
d1 = hy(i-s1x,j-s1y)
d2 = hy(i-s2x,j-s2y)
arr[i][j] = abs(d1-d2)
print ''
arr2 = np.zeros((width,height,3),dtype="uint8")
for ld in [200,116,100,84,68,52,36,20,8,4,2]:
print 'now computing image for ld = '+str(ld)
arr2 *= 0
arr2 += abs(arr%ld-ld/2)*(r,g,b)/(ld/2)
print 'saving image...'
ar2img = Image.fromarray(arr2)
ar2img.save('ld'+str(ld).rjust(4,'0')+'.png')
print 'saved as ld'+str(ld).rjust(4,'0')+'.png'
j'ai réussi à optimiser la plus grande partie, mais il y a encore un énorme écart de performance dans la partie avec le 2 pour-s, et je ne peux pas sembler penser à un moyen de contourner cela en utilisant des opérations de tableau commun ... Je suis ouvert aux suggestions: D
Modifier: En réponse à la suggestion de Vlad, je ' ll poster les détails du problème: Il y a 2 sources de lumière, chacune émettant une lumière comme une onde sinusoïdale: E1 = E0 * sin (omega1 * temps + phi01) E2 = E0 * sin (omega2 * temps + phi02) on considère omega1 = omega2 = omega = 2 * PI/T et phi01 = phi02 = phi0 pour simplifier en considérant x1 comme la distance de la première source d'un point sur le plan, l'intensité de la lumière dans ce point est Ep1 = E0 * sin (omega * temps - 2 * PI * x1/lambda + phi0) où lambda = vitesse de lumière * T (période d'oscillation) En considérant les deux sources de lumière sur le plan, la formule devient Ep = 2 * E0 * cos (PI * (x2-x1)/lambda) sin (omega temps - PI * (x2 -x1)/lambda + phi0) et à partir de là nous avons pu constater que l'intensité de la lumière est maximale lorsque (x2-x1)/lambda = (2 * k) * PI/2 et minimum lorsque (x2-x1)/lambda = (2 * k + 1) * PI/2 et varie entre les deux, où k est un nombre entier
Pour un moment donné de temps, étant donné les coordonnées de les sources de lumière, et pour un lambda connu et E0, nous avons dû faire un programme pour dessiner comment la lumière ressemble IMHO je pense que j'ai optimisé le problème autant qu'il pourrait être fait ...
Vous devriez entrer dans les détails du problème à mon avis. Il est plus facile de rechercher des optimisations dans l'algorithme. Si vous publiez seulement le code, nous devons lire le code, comprendre l'algorithme du code et essayer de l'optimiser. Alors postez votre problème d'origine et votre solution, pas un tas de code. – IVlad