好吧,我最近做了这个作业(不用担心,我已经完成了它,但在C++中),但我很好奇我怎样才能在python中做到这一点。问题在于约2个发光的光源。我不会详细介绍。Python优化问题?
下面的代码(即我已经设法优化后半部分有点):
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
编辑: 为了回应弗拉德的建议,我们会发布问题的详细信息: 有2个光源,每个都以正弦波发光: E1 = E0 * sin(omega1 * time + phi01) E2 = E0 * sin(omega2 * time + phi02) 我们考虑omega1 = omega2 = omega = 2 * pi/T和phi01 = phi02 = phi0为简单起见 考虑到x1是从平面上一点的第一个源的距离,该点的光的强度为Ep1 = E0 * sin(ω*时间-2 * PI * x1 /λ+φ0) 其中 λ=速度光* T(振荡周期) 考虑到平面上的两个光源,公式变为 Ep = 2 * E0 * cos(PI *(x2-x1)/ lambda)sin(ω时间-PI *(x2 (x2-x1)/ lambda =(2 * k)* PI/2时,我们可以发现光的强度是最大的和最小值时 (X2-X1)/λ=(2 * K + 1)* PI/2 和之间,其中k是给定的坐标的整数
对于给定的时间瞬间,而变化在光源,并为已知的lambda和E0,我们不得不做一个程序,以了解灯光的外观 恕我直言,我认为我优化了这个问题尽可能多的,因为它可以做...
在我看来,您应该深入了解问题的细节。在算法中寻找优化更容易。如果您只发布代码,我们必须阅读代码,从代码中找出算法,然后尝试优化它。因此,发布您的原始问题和解决方案,而不是一堆代码。 – IVlad 2010-05-15 20:18:22