我一直在尝试找到使以下代码执行更快的方法:

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秒。

希望那有所帮助...

10-07 19:00
查看更多