为什么这段代码会变慢? Graphics.py?

时间:2019-08-27 20:54:18

标签: python-3.x performance

我有一些代码可以读取一个小的BMP(128x96)文件,并将RGB值放入列表中。

然后我运行一个嵌套循环,并从列表中反向读取RGB值并将其绘制在屏幕上。

它开始非常快,在一秒钟内绘制了前20条线,但是逐渐变慢到我从未见过的程度。它只有一个128x96的小图像。

我觉得这是对graphics.py库的调用,请问为什么,还是其他?

如果可以的话,我正在树莓派上运行它。 Python 3.4.2

如果您有兴趣尝试,可以在这里https://drive.google.com/open?id=1yM9Vn1Nugnu79l1UNShamEAGd2VWF3T4

找到支持文件。

(这是我正在使用的graphics.py库,还有一个很小的bmp文件,实际上是有问题的名为SlowDownWhy.py的文件)

import math

import sys

from graphics import *

from PIL import Image


# Initialise Vars for Image width n height

iw=0

ih=0



img=Image.open("ani1.bmp","r")  # Open Image

iw, ih = img.size               # Set image width n height

ch = int(1000/ih)               # Cube height set

cw = ch                         # Cube width set



win = GraphWin("My Window", iw*cw, ih*ch)

win.setBackground(color_rgb(128,128,128))



#Transfer Bitmap RGB vales to csv list - 'RGBlist'

pix_val = list(img.getdata())

RGBlist = [x for sets in pix_val for x in sets]



noe = (iw * ih * 3)-3

x = iw

y = ih

for vy in list(range(ih)):

    y = y-1

    x = iw

    for vx in list(range(iw)):

        x = x-1


        r=RGBlist[noe]

        g=RGBlist[noe+1]

        b=RGBlist[noe+2]


        noe=noe-3


        cx=x*cw

        cy=y*ch



        aPoint = Rectangle(Point(cx,cy), Point(cx+cw,cy+ch))

        aPoint.setFill(color_rgb(r,g,b))

        aPoint.draw(win)

它应该创建一个高度不超过1000像素的窗口,并开始从右下到左上一行一行地绘制图片。但会逐渐变慢。

1 个答案:

答案 0 :(得分:0)

忽略无效的语法,这仅仅是因为graphics.py的编程方式:它并非旨在处理放置在屏幕上的这么多对象。 (它在后端使用tkinter,它将减慢128 * 96 = 12,288个对象的速度)。对于渲染图像,您应该直接将其集成或使用另一个库,例如pygame。

要将其集成到graphics.py程序中,有一个Image类,您在PIL.Image库中进行了改写(这就是为什么您从不{{1 }})。看这里:Importing custom images into graphics.py