2012-07-27 3 views
5

Ich verarbeite Beobachtungsdaten von vielen Antennenbasislinien. Momentan arbeite ich an ~ 40 Figuren, von denen jede 4x5 Subplot Region hat. Ich fand es langsam beim Plotten und Speichern von Figuren mit Matplotlib in Loops. Hier sind meine Codes:Wie beschleunigt man Matplotlib beim Plotten und Speichern von vielen Figuren?

import numpy as np 
    import matplotlib.pyplot as plt 
    import time 
    ... 

    PLT_PAGE_NUM = 39 # default is 39 
    SUB_PLT_NUM = 20 # default is 20 

    for pp in xrange(0,PLT_PAGE_NUM): 

     plt.figure(figsize=(20,12)) 

     start_time = time.clock() 
     for kk in xrange(0,SUB_PLT_NUM): 
      plt.subplot(5,4,kk+1) 
      plt.plot(np.arange(0,TIME_LENGTH), xcor_real_arr[20*pp+kk,0:],'r-', 
        range(0,TIME_LENGTH), xcor_imag_arr[20*pp+kk,0:],'b-') 
      plt.title('XCOR of '+ ind_arr[20*pp+kk], color='k') 

     plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100) 
     print 'Fig-'+str(pp)+' has been saved' 
     print "Excution time:", time.clock()-start_time 

Und die Ausfürung Zeit info ist:

######### Check your inputs setting ######### 
You have selected 2 files. 
The time interval is From 2011-10-20_14:28:38 to 2011-10-20_15:10:54 
Your time resolution is set to 1.125s 
The total plot points number is: 100 
Your frequency channel is: ch2 
######### Hardworking...please wait ######### 
Fig-0 has been saved 
Excution time: *2.52576639619* 
Fig-1 has been saved 
Excution time: *2.59867230708* 
Fig-2 has been saved 
Excution time: *2.81915188482* 
Fig-3 has been saved 
Excution time: *2.83102198991* 
Program ends 

Wie Sie gesehen haben, ich plotten nur 4 Zahlen, die etwa 11 Sekunden kosten. Es dauert ~ 2 Minuten, um alle 39 Figuren zu zeichnen und zu speichern. Ich weiß nicht, wo der Engpass ist. Kannst du helfen, es schneller zu machen? Danke!

Antwort

3

Ich habe Ihren Code geändert, um es runnable zu machen:

import numpy as np 
import matplotlib.pyplot as plt 
import time 

PLT_PAGE_NUM = 39 # default is 39 
SUB_PLT_NUM = 20 # default is 20 
TIME_LENGTH = 1000 

xcor_real_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH)) 
xcor_imag_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH)) 
for pp in xrange(0,PLT_PAGE_NUM): 

    plt.figure(figsize=(20,12)) 

    start_time = time.time() 
    for kk in xrange(0,SUB_PLT_NUM): 
     plt.subplot(5,4,kk+1) 
     plt.plot(np.arange(0,TIME_LENGTH), xcor_real_arr[SUB_PLT_NUM*pp+kk,0:],'r-', 
       range(0,TIME_LENGTH), xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:],'b-') 
     plt.title('XCOR of '+ str(SUB_PLT_NUM*pp+kk), color='k') 

    plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100) 
    print 'Fig-'+str(pp)+' has been saved' 
    print "Excution time:", time.time()-start_time 

Auf meinem Rechner jede Figur dauert ca. 3 Sekunden:

Fig-0 has been saved 
Excution time: 3.01798415184 
Fig-1 has been saved 
Excution time: 3.08960294724 
Fig-2 has been saved 
Excution time: 2.9629740715 

Mit Ideen aus den Matplotlib Animations Cookbook (und auch gezeigt, von Joe Kington, here), können wir dies um etwa 33% (1 Sekunde pro Figur) beschleunigen, indem wir dieselben Achsen wiederverwenden und einfach die y-Daten für jedes Diagramm neu definieren:

import numpy as np 
import matplotlib.pyplot as plt 
import time 

PLT_PAGE_NUM = 39 # default is 39 
SUB_PLT_NUM = 20 # default is 20 
TIME_LENGTH = 1000 

xcor_real_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH)) 
xcor_imag_arr = np.random.random((SUB_PLT_NUM*PLT_PAGE_NUM,TIME_LENGTH)) 
plt.figure(figsize=(20,12)) 

ax = {} 
line1 = {} 
line2 = {} 

for pp in xrange(0,PLT_PAGE_NUM): 
    start_time = time.time() 
    for kk in xrange(0,SUB_PLT_NUM): 
     if pp == 0: 
      ax[kk] = plt.subplot(5,4,kk+1) 
      line1[kk], line2[kk] = ax[kk].plot(np.arange(0,TIME_LENGTH), 
            xcor_real_arr[SUB_PLT_NUM*pp+kk,0:],'r-', 
            range(0,TIME_LENGTH), 
            xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:],'b-') 
     else: 
      line1[kk].set_ydata(xcor_real_arr[SUB_PLT_NUM*pp+kk,0:]) 
      line2[kk].set_ydata(xcor_imag_arr[SUB_PLT_NUM*pp+kk,0:]) 
     plt.title('XCOR of '+ str(SUB_PLT_NUM*pp+kk), color='k') 

    plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100) 
    print 'Fig-'+str(pp)+' has been saved' 
    print "Excution time:", time.time()-start_time 

welche diese Ausführungszeiten ergibt:

Fig-0 has been saved 
Excution time: 3.0408449173 
Fig-1 has been saved 
Excution time: 2.05084013939 
Fig-2 has been saved 
Excution time: 2.01951694489 

(Die erste Figur noch dauert 3 Sekunden, um die Anfangsstücke einzurichten. Es ist auf nachfolgenden Abbildungen, wo wir etwas Zeit sparen können.)

+0

unutbu, versuchte ich, Ihre Codes laufen zu lassen. Es ist erstaunlich, dass die Gesamtausführungszeit auf meinem Laptop auf 68.515999794 Sekunden verkürzt ist. Eine große Hilfe für mich, danke. Und die gleichen Achsen wiederzuverwenden (oder "einzufrieren") ist ein guter Hinweis! –

Verwandte Themen