2017-03-31 86 views
1

我創建一個程序(測試理論),並獲得我所需要的數據,我需要一個程序,以儘可能快地運行。Python的速度優化

這裏的問題 - 我已和我一樣快可以管理,它仍然是慢。它使用我的電腦的RAM和CPU容量的非常小的數量。我使用PyCharm 2017 Community Edition運行程序。

代碼如下;我將如何進一步優化或改變它以使其運行更快?

主營:

from functions import * 
from graphics import * 
import time 

Alpha = True 

x = timestamp() 

while Alpha: 
    master = GraphWin(title="Image", width=512, height=512) 

    build_image(master) 

    getter(master, x) 

    x = timestamp() 

    time.sleep(3) 

    master.close() 

模塊 「功能」:

from graphics import * 
import random 
from PIL import ImageGrab 


def build_image(window): 
    for i in range(513): 
     for j in range(513): 
      fig = Rectangle(Point(j, i), Point(j + 1, i + 1)) 
      color = random.randrange(256) 
      fig.setFill(color_rgb(color, color, color)) 
      fig.setOutline(color_rgb(color, color, color)) 
      fig.draw(window) 


def getter(widget, counter): 
    x = widget.winfo_rootx()+widget.winfo_x() 
    y = widget.winfo_rooty()+widget.winfo_y() 
    x1 = x+widget.winfo_width() 
    y1 = y+widget.winfo_height() 
    ImageGrab.grab().crop((x, y, x1, y1)).save("{}.png".format(str(counter))) 


def timestamp(): 
    timelist = time.gmtime() 
    filename = ("Image" + "_" + str(timelist[0]) + "_" + str(timelist[1]) + "_" + str(timelist[2]) + "_" + 
       str(timelist[3]) + "_" + str(timelist[4]) + "_" + str(timelist[5]) + "_UTC") 
    return filename 

注:模塊 「圖形」 是一個模塊,允許的Tkinter的操控方便。

+0

PyCharm只是要使用它配置使用的W/E Python解釋器。如果你的程序運行的話,它不會有太多的影響。這是一個非常模糊的問題。使用一個分析器來找出什麼是最花時間和優化。根據您的限制,您可能需要更快(非解釋)的語言。 –

+0

望着[文件](http://pillow.readthedocs.io/en/3.1.x/reference/ImageGrab.html)我發現,你能傳遞'bbox'參數PIL.ImageGrab.grab。這可以節省一些時間。您也可以考慮使用PIL來首先創建您的圖像,而不是像奧斯汀黑斯廷斯建議的那樣拍攝窗口截圖。 – BurningKarl

+0

@CDspace回滾您的編輯。這個問題已經解決了,請不要改變它。 –

回答

3

你的緩慢可能是從治療的像素爲你的窗口矩形。

如果你想要做的是隨機生成的圖像,你可以跳過該窗口的一部分。我發現這個代碼鋪設約,沒有太多的迴避後:

from PIL import Image 
import random 

def drawImage(): 
    testImage = Image.new("RGB", (600,600), (255,255,255)) 
    pixel = testImage.load() 

    for x in range(600): 
     for y in range(600): 
      red = random.randrange(0,255) 
      blue = random.randrange(0,255) 
      green = random.randrange(0,255) 
      pixel[x,y]=(red,blue,green) 
    return testImage 

def main(): 
    finalImage = drawImage() 
    finalImage.save("finalImage.jpg") 
+0

它的工作原理 - 正是我需要的!非常感謝! –

+0

如果您使用putdata將所有像素一次放入,而不是使用該循環,那可能會更快。例如:'testImage.putdata([random.randrange(16777215)for _in range(360000)])' – Novel

+0

or:Image.fromarray(np.random.randint(255,size =(600,600,3)) .astype(np.uint8))按照我下面的答案。 – user1269942

2

使用分析器,看看你的程序是快/慢。這裏有一個你可以在你的函數中使用的配置文件包裝器來查看你的程序中需要花費的時間。

def line_profiler(view=None, extra_view=None): 
import line_profiler 

def wrapper(view): 
    def wrapped(*args, **kwargs): 
     prof = line_profiler.LineProfiler() 
     prof.add_function(view) 
     if extra_view: 
      [prof.add_function(v) for v in extra_view] 
     with prof: 
      resp = view(*args, **kwargs) 
     prof.print_stats() 
     return resp 
    return wrapped 
if view: 
    return wrapper(view) 
return wrapper 

現在如何使用它

@line_profiler 
def simple(): 
    print("Hello") 
    print("World") 

現在,當你運行你的功能,你會得到的一切長期如何進行打印輸出。

你可能需要做pip install line_profiler

+0

這是可行的 - 感謝您的回答! –

1

既然你做了很多獨立的任務,你可以從並行中受益。例如:

from concurrent.futures import ThreadPoolExecutor 

def build_image(window, start, end, step): 
    for i in range(start, end, step): 
     for j in range(end): 
      fig = Rectangle(Point(j, i), Point(j + 1, i + 1)) 
      color = random.randrange(256) 
      fig.setFill(color_rgb(color, color, color)) 
      fig.setOutline(color_rgb(color, color, color)) 
      fig.draw(window) 

max_workers = 8 
with ThreadPoolExecutor(max_workers=max_workers) as executor: 
    for id in range(max_workers): 
     executor.submit(build_image, window, id, 513, max_workers) 
2

如果您使用numpy,這可能會快一點。循環內的循環會殺死你的速度。

from PIL import Image 
import numpy as np 

def drawImage(): 
    return Image.fromarray(np.random.randint(255, size=(600, 600, 3)).astype(np.uint8))