좋아요, 최근에이 숙제가있었습니다. (걱정하지 마세요, 이미 해봤지만 C++에서는)하지만 파이썬으로 어떻게 할 수 있는지 궁금합니다. 문제는 빛을 방출하는 약 2 개의 광원입니다. 나는 세부 사항 tho로 들어 가지 않을 것이다. 여기 파이썬 최적화 문제?
(나는 후반에 약간의 최적화 관리 한 것을) 코드입니다 : 나는 그것의 대부분을 최적화하기 위해 관리해야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'
을하지만, 함께 부분에서 큰 성능 차이는 여전히있다 2 for-s, 그리고 일반적인 배열 작업을 사용하여 그 우회하는 방법을 생각하지 않는 것 ... 나는 제안에 개방적이다 : D
편집 : Vlad의 제안에 대한 응답으로, 문제의 세부 정보를 게시 할 것입니다 : 두 개의 광원이 있으며, 각각 빛을 사인파로 방출합니다. E1 = E을 단순화하기 위해, x1을 고려함으로써, omega1 = omega2 = omega = 2 * PI/T 및 phi01 = phi02 = phi0을 고려한다. 평면상의 점의 제 1 소스로부터의 거리, 그 점에서의 광의 강도는 이다 .Ep1 = E0 * sin (ω * time - 2 * PI * x1/λ + phi0) 여기서, λ = 속도 빛 * T (진동주기) 두 광원을 모두 고려할 때, 공식은 Ep = 2 * E0 * cos (PI * (x2-x1)/λ) sin (ω 시간 - PI * -x1)/λ + phi0) 이고, 이로부터 우리는 빛의 세기가 최대일 때, (x2-x1)/λ = (2 * k) * PI/2,최소 때 (X2-X1)/람다 = (2 * K + 1) * PI/2 k는 좌표의 소정의 정수 시간의 주어진 순간 용
에게, 여기서 사이 변화 광원 및 알려진 람다 및 E0에 대해 우리는 빛이 어떻게 보이는지 그리는 프로그램을 작성해야했습니다 IMHO 나는이 문제를 내가 수행 할 수있는만큼 최대한 최적화했다고 생각합니다 ...
제 생각에는 문제의 세부 사항에 대해 알아야합니다. 알고리즘에서 최적화를 찾는 것이 더 쉽습니다. 코드를 게시하는 경우 코드를 읽고 코드에서 알고리즘을 찾아내어 최적화해야합니다. 그래서 원래의 문제와 해결책을 게시하십시오. – IVlad