好的,所以我有一段真正需要优化的 Python 代码。
- 这是对小(80x60 像素)图像的生命游戏迭代,并从中提取 RGB 值。
- 当前使用嵌套的 for 循环;我宁愿将那些 for 循环换成更快的
map()
c 函数,但是如果这样做,我将无法弄清楚如何获取 x,y 值,也无法确定在函数范围之外定义的局部值d 需要定义。 - 使用
map()
会比当前的 for 循环集更快吗?我怎么能使用它并且仍然得到x,y? - 我目前使用 pygame Surfaces,并且我已经尝试过这些
surfarray/pixelarray
模块,但是由于我正在更改/获取每个像素,所以它比Surface.get_at()/set_at()
. - 另外,有点无关紧要......如果Python不遍历数字列表而只是增加一个数字,你认为这可以更快吗,就像在其他语言中一样?为什么 python 不包含普通的 for() 以及它们的 foreach()?
- 那里的条件数量可能也会让事情变慢,对吧?最慢的部分是检查邻居(它在哪里构建列表n)......我用二维数组上的切片访问替换了整个位,但它不能正常工作。
代码的编辑版本:
xr = xrange(80)
yr = xrange(60)
# surface is an instance of pygame.Surface
get_at = surface.get_at()
set_at = surface.set_at()
for x in xr:
# ....
for y in yr:
# ...
pixelR = get_at((x,y))[0]
pixelG = get_at((x,y))[1]
pixelB = get_at((x,y))[2]
# ... more complex stuff here which changes R,G,B values independently of each other
set_at((x,y),(pixelR,pixelG,pixelB))
完整版功能:
# xr, yr = xrange(80), xrange(60)
def live(surface,xr,yr):
randint = random.randint
set_at = surface.set_at
get_at = surface.get_at
perfect = perfectNeighbours #
minN = minNeighbours # All global variables that're defined in a config file.
maxN = maxNeighbours #
pos = actual # actual = (80,60)
n = []
append = n.append
NEIGHBOURS = 0
for y in yr: # going height-first for aesthetic reasons.
decay = randint(1,maxDecay)
growth = randint(1,maxGrowth)
for x in xr:
r, g, b, a = get_at((x,y))
del n[:]
NEIGHBOURS = 0
if x>0 and y>0 and x<pos[0]-1 and y<pos[1]-1:
append(get_at((x-1,y-1))[1])
append(get_at((x+1,y-1))[1])
append(get_at((x,y-1))[1])
append(get_at((x-1,y))[1])
append(get_at((x+1,y))[1])
append(get_at((x-1,y+1))[1])
append(get_at((x+1,y+1))[1])
append(get_at((x,y+1))[1])
for a in n:
if a > 63:
NEIGHBOURS += 1
if NEIGHBOURS == 0 and (r,g,b) == (0,0,0): pass
else:
if NEIGHBOURS < minN or NEIGHBOURS > maxN:
g = 0
b = 0
elif NEIGHBOURS==perfect:
g += growth
if g > 255:
g = 255
b += growth
if b > growth: b = growth
else:
if g > 10: r = g-10
if g > 200: b = g-100
if r > growth: g = r
g -= decay
if g < 0:
g = 0
b = 0
r -= 1
if r < 0:
r = 0
set_at((x,y),(r,g,b))