我一直在尝试找到使以下代码执行更快的方法:
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秒。
希望那有所帮助...