2011-07-28 38 views
1

我使用matplotlib在我的django應用程序中繪製了一些小的數據集,但導入語句與運行時間相比,我的以前的版本增加了大約1-2秒 - 使用JavaScript圖形工具 - 所以現在它幾乎需要3秒,而不是在1/2秒之內來加載頁面。即使我辦公室的大多數人都不在乎,它仍會讓我感到不安。任何方式來加快matplotlib的Web服務器(Django)應用程序的加載時間?

這裏的基本代碼:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure(figsize=[7, 7]) 
canvas = FigureCanvas(fig) 
ax = fig.add_axes([1, 1, 5, 5]) 
ax.scatter(x, y, c=colors, s=15, linewidth=1.5) 
ax.set_xticklabels(labels, rotation=-40, horizontalalignment='left') 
fig.savefig(file) 

有沒有更輕質方法加載圖 - 或者不同的後端是更快?

我從javascript實用程序切換,因爲我的同事需要能夠從網站複製和粘貼圖像。我喜歡使用matplotlib的想法,因爲現在我可以製作一些更出色的圖表,但如果這樣的表現會更好,我可以使用其他輕量級工具。

另一個想法是使某種服務器應用程序始終運行並偵聽端口以進行查詢,然後發回映像。然後它不必爲每個查詢加載整個matplotlib庫。但是,這聽起來像很多工作。

+0

您是在主視圖中渲染圖像並將其保存爲文件,還是將它們渲染爲單獨的視圖並返回HttpResponse?緩存可能嗎? –

+0

我將圖保存在臨時png文件中,然後主視圖模板獲取臨時文件的路徑並顯示它。緩存不會提供太多幫助,因爲人們可以自定義他們的圖形,大多數圖像只能看到幾次。 – brfox

回答

1

您應該在單獨的視圖中呈現圖像。這可讓您的瀏覽器在圖像(或圖像)仍在生成時開始渲染頁面。

def view(request): 
    ... 
    response=django.http.HttpResponse(content_type='image/png') 
    canvas.print_png(response) 
    return response 

(代碼從http://www.scipy.org/Cookbook/Matplotlib/Django

此外,Django的過程不應該每個頁面請求後死去。嘗試配置Apache/Nginx以使多個進程保持活動以供將來的頁面請求使用。第一次渲染圖像視圖時,每個進程必須執行import語句。之後,你應該有加速。

+0

這是關於首先加載頁面其餘部分的好處。另外,我還配置了apache,每次從頭開始重新加載。但是,你說得對,我應該改變這個apache設置,這樣我也可以在那裏獲得一些提速。謝謝。 – brfox

相關問題