10

多くのアンテナベースラインからの観測データを処理しています。現在、私が取り組んでいるのは、それぞれが 4x5 のサブプロット領域を持つ ~ 40 の図をプロットすることです。ループでmatplotlibを使用して図をプロットおよび保存すると、速度が低下することがわかりました。ここに私のコードがあります:

    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

実行時間情報は次のとおりです。

######### 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

ご覧のとおり、約 11 秒かかる 4 つの数字をプロットするだけです。39 個の図すべてをプロットして保存するには、約 2 分かかります。ボトルネックがどこにあるかわかりません。より速くするのを手伝ってもらえますか? ありがとう!

4

1 に答える 1

3

コードを変更して実行可能にしました。

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

私のマシンでは、各図には約 3 秒かかります。

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

Matplotlib Animations Cookbookのアイデアを使用して(また、ここでJoe Kington によって実演されています)、同じ軸を再利用し、各プロットの y データを再定義するだけで、これを約 33% (図ごとに 1 秒) 高速化できます。

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

これにより、次の実行時間が得られます。

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

(最初の図では、最初のプロットを設定するのにまだ 3 秒かかります。時間を節約できるのは、後続の図です。)

于 2012-07-27T13:36:06.693 に答える