2010-06-04 9 views
5

मेरे पास एक लूप है जो शरीर को 200 बार निष्पादित करता है। प्रत्येक पाश पुनरावृत्ति में, यह एक परिष्कृत गणना करता है, और फिर डीबगिंग के रूप में, मैं एक एनएक्सएम मैट्रिक्स का एक तापमैप उत्पन्न करना चाहता हूं। लेकिन, इस हीटमैप को उत्पन्न करना असहनीय रूप से धीमा है और पहले से धीमे एल्गोरिदम को धीमा कर देता है। 300 x युगल के 600pyplot: वास्तव में धीमी गति से हीटमैप्स बनाने

import numpy 
import matplotlib.pyplot as plt 
for i in range(200): 
    matrix = complex_calculation() 
    plt.set_cmap("gray") 
    plt.imshow(matrix) 
    plt.savefig("frame{0}.png".format(i)) 

मैट्रिक्स, numpy से, बहुत बड़ा नहीं है ---:

मेरे कोड पंक्तियों के साथ है। यहां तक ​​कि अगर मैं आकृति को सहेजता नहीं हूं और इसके बजाय ऑन-स्क्रीन प्लॉट अपडेट करता हूं, तो यह धीमा भी है।

निश्चित रूप से मुझे पाइपल का दुरुपयोग करना होगा। (Matlab यह कर सकते हैं, कोई समस्या नहीं है।) मैं इसे कैसे गति दे सकता हूँ?

उत्तर

5

पाश में plt.clf() डालने की कोशिश वर्तमान आंकड़ा स्पष्ट करने के लिए:

for i in range(200): 
    matrix = complex_calculation() 
    plt.set_cmap("gray") 
    plt.imshow(matrix) 
    plt.savefig("frame{0}.png".format(i)) 
    plt.clf() 

यदि आप ऐसा नहीं करते हैं, तो पाश धीमा के रूप में मशीन आंकड़ा के लिए अधिक से अधिक स्मृति को आबंटित करने के लिए संघर्ष।

+0

अभी भी धीमा है, लेकिन कम से कम यह अब सहनशील है। – carl

3

मुझे लगता है कि यह एक सा तेजी से होता है:

import matplotlib.pyplot as plt 
from matplotlib import cm 
fig = plt.figure() 
ax = fig.add_axes([0.1,0.1,0.8,0.8]) 
for i in range(200): 
    matrix = complex_calculation() 
    ax.imshow(matrix, cmap=cm.gray) 
    fig.savefig("frame{0}.png".format(i)) 

plt.imshow कॉल gca जो gcf जो अगर वहाँ एक आंकड़ा है देखने के लिए जाँच करता है कहता है; यदि नहीं, तो यह एक बनाता है। पहले आकृति को मैन्युअल रूप से चालू करके, आपको यह सब करने की आवश्यकता नहीं है।

संबंधित मुद्दे