Python matplotlib打印速度非常慢

Python matplotlib打印速度非常慢,python,matplotlib,plot,figure,figures,Python,Matplotlib,Plot,Figure,Figures,我有多个函数,其中我输入一个数组或dict以及一个路径作为参数,该函数将把一个图形保存到特定路径的路径 尽量减少示例,但这里有两个函数: def valueChartPatterns(dict,path): seen_values = Counter() for data in dict.itervalues(): seen_values += Counter(data.values()) seen_values = seen_values.most_

我有多个函数,其中我输入一个数组或dict以及一个路径作为参数,该函数将把一个图形保存到特定路径的路径

尽量减少示例,但这里有两个函数:

def valueChartPatterns(dict,path):
    seen_values = Counter()

    for data in dict.itervalues():
        seen_values += Counter(data.values())

    seen_values = seen_values.most_common()
    seen_values_pct = map(itemgetter(1), tupleCounts2Percents(seen_values))
    seen_values_pct = ['{:.2%}'.format(item)for item in seen_values_pct]

    plt.figure()

    numberchart = plt.bar(range(len(seen_values)), map(itemgetter(1), seen_values), width=0.9,align='center')
    plt.xticks(range(len(seen_values)), map(itemgetter(0), seen_values))

    plt.title('Values in Pattern Dataset')
    plt.xlabel('Values in Data')
    plt.ylabel('Occurrences')

    plt.tick_params(axis='both', which='major', labelsize=6)
    plt.tick_params(axis='both', which='minor', labelsize=6)
    plt.tight_layout()

    plt.savefig(path)
    plt.clf()

def countryChartPatterns(dict,path):
    seen_countries = Counter()

    for data in dict.itervalues():
        seen_countries += Counter(data.keys())

    seen_countries = seen_countries.most_common()

    seen_countries_percentage = map(itemgetter(1), tupleCounts2Percents(seen_countries))
    seen_countries_percentage = ['{:.2%}'.format(item)for item in seen_countries_percentage]

    yvals = map(itemgetter(1), seen_countries)
    xvals = map(itemgetter(0), seen_countries)

    plt.figure()

    countrychart = plt.bar(range(len(seen_countries)), yvals, width=0.9,align='center')
    plt.xticks(range(len(seen_countries)), xvals)

    plt.title('Countries in Pattern Dataset')
    plt.xlabel('Countries in Data')
    plt.ylabel('Occurrences')

    plt.tick_params(axis='both', which='major', labelsize=6)
    plt.tick_params(axis='both', which='minor', labelsize=6)
    plt.tight_layout()

    plt.savefig(path)
    plt.clf()
一个非常简单的例子是dict,但实际dict包含56000个值:

dict = {"a": {"Germany": 20006.0, "United Kingdom": 20016.571428571428}, "b": {"Chad": 13000.0, "South Africa": 3000000.0},"c":{"Chad": 200061.0, "South Africa": 3000000.0}
    }
在我的剧本中,我称之为:

if __name__ == "__main__":

    plt.close('all')

    print "Starting pattern charting...\n"

    countryChartPatterns(dict,'newPatternCountries.png'))

    valueChartPatterns(dict,'newPatternValues.png'))
注意,我将
导入matplotlib.pyplot作为plt

在PyCharm中运行此脚本时,我在控制台中获得了
开始模式图表…
,但绘制函数需要很长时间


我做错了什么?我是否应该使用柱状图而不是条形图,因为这应该达到提供国家/值出现次数的相同目的?我可以改变我的GUI后端吗?欢迎任何建议。

这是我在上述评论中提到的测试,结果是:

Elapsed pre-processing = 13.79 s
Elapsed plotting = 0.17 s
Pre-processing / plotting = 83.3654562565
测试脚本:

import matplotlib.pylab as plt
from collections import Counter
from operator import itemgetter
import time

def countryChartPatterns(dict,path):
    # pre-processing -------------------
    t0 = time.time()

    seen_countries = Counter()

    for data in dict.itervalues():
        seen_countries += Counter(data.keys())

    seen_countries = seen_countries.most_common()

    yvals = map(itemgetter(1), seen_countries)
    xvals = map(itemgetter(0), seen_countries)

    dt1 = time.time() - t0
    print("Elapsed pre-processing = {0:.2f} s".format(dt1))

    t0 = time.time()

    # plotting -------------------
    plt.figure()

    countrychart = plt.bar(range(len(seen_countries)), yvals, width=0.9,align='center')
    plt.xticks(range(len(seen_countries)), xvals)

    plt.title('Countries in Pattern Dataset')
    plt.xlabel('Countries in Data')
    plt.ylabel('Occurrences')

    plt.tick_params(axis='both', which='major', labelsize=6)
    plt.tick_params(axis='both', which='minor', labelsize=6)
    plt.tight_layout()

    plt.savefig(path)
    plt.clf()

    dt2 = time.time() - t0 
    print("Elapsed plotting = {0:.2f} s".format(dt2))
    print("Pre-processing / plotting = {}".format(dt1/dt2))

if __name__ == "__main__":
    import random as rd
    import numpy as np

    countries = ["United States of America", "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Antigua & Deps", "Argentina", "Armenia", "Australia", "Austria", "Azerbaijan"]

    def item():
        return {rd.choice(countries): np.random.randint(1e3), rd.choice(countries): np.random.randint(1e3)}
    dict = {}
    for i in range(1000000):
        dict[i] = item()

    print("Starting pattern charting...")

    countryChartPatterns(dict,'newPatternCountries.png')

我会计算
for
在字典上循环需要多长时间;在我看来,这似乎是一个让事情变慢的嫌疑犯。除此之外;如果没有一个有效的例子,我们只能猜测……有什么标准的东西可以用
matplotlib
来加速吗?尝试使用小数据集效果绝对不错。您确定是
matplotlib
速度慢吗?因为小数据集也简化了预处理。。不要开始优化,直到你真正知道哪个部分是慢的!我会使用最简单的计时器(或者查看Python分析器)<代码>导入时间;t0=时间。时间();你的密码;打印(time.time()-t0)并在(1)数据预处理(循环的
和其他所有内容)和(2)绘图部分周围放置此类计时器。我对结果很好奇,我很快就对它进行了测试(仅针对
countryChartPatterns()
);对于
dict
中的1e6值,打印成本比预处理低70倍。不确定这是否是一个完全公平的测试(以我创建
dict
的方式),但这可能是一个暗示,表明问题在哪里被理解。谢谢你指出。我读了一些关于更改GUI后端的内容,但显然不是我的问题。谢谢