我一直在设法使以下代码执行得更快:
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命令,它们只是为了说明)创建了一个dictionary(MYTAMDICT),我用cString对象填充它,这些对象用于在内存中存储图表。这些图表稍后会动态地呈现给用户。在
有人能帮我利用线程,这样我就可以使用我所有的核心,并使这个功能执行得更快吗?或者给我指点改进的方法?在
对于描述,您最好使用多处理而不是线程。。。您有一个“令人尴尬的并行”问题,而且没有磁盘IO约束(您正在写入内存),当然,在进程之间来回传递大型数据将非常昂贵,但是返回一个表示.png的字符串应该不会太糟糕。。在
可以很简单地完成:
如果不使用多处理,在我的机器上需要大约250秒。对于多处理(8核),需要大约40秒。在
希望这有点帮助。。。在
当且仅当pylab在执行时释放gil时,线程将帮助您。
而且,在这种情况下,线程必须是安全的。在
也就是说,如果您要使用线程,我认为这是作业队列的一个经典案例;因此,我将使用一个queue object,它足以处理这个模式。在
这里有一个例子,我只是通过修改代码和队列文档中给出的示例来实现的。我甚至没有彻底检查它,所以它会有错误;它比任何东西都更能给出一个想法。在
相关问题 更多 >
编程相关推荐