gpt4 book ai didi

python - 线程快速创建大量图表

转载 作者:行者123 更新时间:2023-11-28 22:06:12 27 4
gpt4 key购买 nike

我一直在努力寻找让下面这段代码执行得更快的方法:

def do_chart(target="IMG_BACK", xlabel="xlabel", ylabel="ylabel", title="title",       ydata=pylab.arange(1961, 2031, 1)):
global MYRAMDICT
MYRAMDICT = {}
print "here"
for i in range(70):
MYRAMDICT[i] = cStringIO.StringIO()
xdata = pylab.arange(1961, 2031, 1)
pylab.figure(num=None, figsize=(10.24, 5.12), dpi=1, facecolor='w', edgecolor='k')
pylab.plot(xdata, ydata, linewidth=3.0)
pylab.xlabel(xlabel); pylab.ylabel(ylabel); pylab.title(i)
pylab.grid(True)
pylab.savefig(MYRAMDICT[i], format='png')
pylab.close()

此函数(请忽略 pylab 命令,它们在这里仅用于说明)创建一个字典 (MYTAMDICT),我在其中填充了用于在内存中存储图表的 cString 对象。这些图表随后会动态呈现给用户。

有人可以帮助我使用线程,以便我可以使用我的所有核心并使该功能执行得更快吗?或者指出改进它的想法?

最佳答案

对于描述,使用多处理比使用线程要好得多......你有一个“令人尴尬的并行”问题,并且没有磁盘 IO 限制(你正在写入内存)当然,将大的东西传回在进程之间来回会变得昂贵,但返回一个代表 .png 的字符串应该不会太糟糕..

它可以很简单地完成:

import multiprocessing
import cStringIO

import matplotlib.pyplot as plt
import numpy as np

import itertools

def main():
"""Generates 1000 random plots and saves them as .png's in RAM"""
pool = multiprocessing.Pool()
same_title = itertools.repeat('Plot %i')
fig_files = pool.map(plot, itertools.izip(xrange(1000), same_title))

def plot(args):
"""Make a random plot"""
# Unfortunately, pool.map (and imap) only support a single argument to
# the function, so you'll have to unpack a tuple of arguments...
i, titlestring = args

outfile = cStringIO.StringIO()

x = np.cumsum(np.random.random(100) - 0.5)

fig = plt.figure()
plt.plot(x)
fig.savefig(outfile, format='png', bbox_inches='tight')
plt.title(titlestring % i)
plt.close()

# cStringIO files aren't pickelable, so we'll return the string instead...
outfile.seek(0)
return outfile.read()

main()

在不使用多处理的情况下,这在我的机器上需要大约 250 秒。使用多处理(8 核),大约需要 40 秒。

希望对您有所帮助...

关于python - 线程快速创建大量图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com