Python速度优化

Python速度优化,python,tkinter,pycharm,Python,Tkinter,Pycharm,我正在创建一个程序(测试一个理论),为了得到我需要的数据,我需要一个程序以尽可能快的速度运行 这就是问题所在——我已经尽我所能让它变得快了,但它仍然很慢。它只使用了我电脑中非常少的RAM和CPU容量。我正在使用PyCharm 2017社区版运行该程序 代码如下;我将如何进一步优化或更改它以使其运行更快 主要内容: 模块“功能”: 注:模块“图形”是一个允许轻松操作Tkinter的模块。使用探查器查看程序的快/慢位置。下面是一个概要文件包装器,您可以在函数上使用它来查看程序中花费的时间太长 def

我正在创建一个程序(测试一个理论),为了得到我需要的数据,我需要一个程序以尽可能快的速度运行

这就是问题所在——我已经尽我所能让它变得快了,但它仍然很慢。它只使用了我电脑中非常少的RAM和CPU容量。我正在使用PyCharm 2017社区版运行该程序

代码如下;我将如何进一步优化或更改它以使其运行更快

主要内容:

模块“功能”:


注:模块“图形”是一个允许轻松操作Tkinter的模块。

使用探查器查看程序的快/慢位置。下面是一个概要文件包装器,您可以在函数上使用它来查看程序中花费的时间太长

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安装line\u profiler

使用profiler查看程序的快/慢位置。下面是一个概要文件包装器,您可以在函数上使用它来查看程序中花费的时间太长

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安装line\u profiler

您的速度慢可能是因为将像素视为窗口中的矩形

如果您只想生成随机图像,可以跳过窗口部分。在没有太多闪避之后,我发现这段代码到处都是:

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")

您的速度慢可能是因为在窗口中将像素视为矩形

如果您只想生成随机图像,可以跳过窗口部分。在没有太多闪避之后,我发现这段代码到处都是:

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")

由于您要执行许多独立的任务,因此可以从并行性中获益。比如:

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)

由于您要执行许多独立的任务,因此可以从并行性中获益。比如:

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)

如果使用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))

如果使用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))

PyCharm将使用它配置为使用的w/e Python解释器。它不会对程序的运行方式产生太大的影响。这是一个非常模糊的问题。使用探查器找出花费时间最多的是什么,并对其进行优化。根据您的限制,您可能需要更快的(非解释性)语言。查看我发现您可以将
bbox
参数传递给PIL.ImageGrab.grab。这可以节省一些时间。你也可以考虑使用PIL来创建你的图像,而不是像Austin Hastings建议的那样使用一个窗口的截图。问题已经解决,请不要将其从当前更改。请不要添加“已解决”或类似于您的帖子的内容。既然你已经接受了答案,人们会发现你的问题已经解决了。谢谢@FelixSFD。我正要把它滚回去,然后。系统本身让我们知道,如果OP接受了answerPyCharm,它将使用它配置为使用的w/e Python解释器,那么问题就解决了。它不会对程序的运行方式产生太大的影响。这是一个非常模糊的问题。使用探查器找出花费时间最多的是什么,并对其进行优化。根据您的限制,您可能需要更快的(非解释性)语言。查看我发现您可以将
bbox
参数传递给PIL.ImageGrab.grab。这可以节省一些时间。你也可以考虑使用PIL来创建你的图像,而不是像Austin Hastings建议的那样使用一个窗口的截图。问题已经解决,请不要将其从当前更改。请不要添加“已解决”或类似于您的帖子的内容。既然你已经接受了答案,人们会发现你的问题已经解决了。谢谢@FelixSFD。我正要把它滚回去,然后。系统本身让我们知道,如果OP接受了答案,它就解决了——这正是我所需要的!非常感谢你!如果使用
putdata
一次放入所有像素,而不是使用该循环,则速度可能会快得多。例如:
testImage.putdata([random.randrange(16777215)表示范围内(360000)])
or:Image.fromarray(np.random.randint(255,size=(600600,3)).astype(np.uint8)),正如我下面的答案所示。它可以工作——正是我所需要的!非常感谢你!如果使用
putdata
一次放入所有像素,而不是使用该循环,则速度可能会快得多。例如:
testImage.putdata([random.randrange(16777215)表示范围内(360000)])
or:Image.fromarray(np.random.randint(255,size=(600600,3)).astype(np.uint8)),如我下面的回答所示。