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