2012-04-22 24 views
10

Tôi muốn hiển thị một hoạt ảnh đơn giản bằng cách gọi số imshow trong vòng lặp for. Dưới đây là một bản demo của vấn đề của tôi:Tại sao hoạt ảnh pylab của tôi chậm lại với mỗi lần cập nhật?

import pylab,time 
images = [pylab.uniform(0,255,(50,50)) for _ in xrange(40)] 
pylab.ion() 
timings = [] 
for img in images: 
    tic = time.time() 
    pylab.imshow(img) 
    pylab.draw() 
    toc = time.time() 
    timings.append(toc-tic) 
pylab.clf() 
pylab.plot(timings) 
pylab.title('elapsed time per iteration') 
pylab.ioff() 
pylab.show() 

Lưu ý rằng tôi tạo ra những hình ảnh trước khi chạy vòng lặp, và rằng các bộ phận duy nhất tôi thời gian là imshowdraw chức năng. Tôi nhận được kết quả trông giống như sau: Result of running my demo

Làm cách nào để tránh sự cố này?

Trả lời

11

Mọi thứ đang chậm lại vì bạn đang thêm nhiều hình ảnh hơn và vẽ chúng tất cả mỗi lần.

Hoặc 1) xóa ô giữa mỗi hình ảnh (Trong trường hợp của bạn là pylab.cla()), hoặc tốt hơn 2) không tạo hình ảnh mới, chỉ cần đặt dữ liệu của hình ảnh hiện có thành dữ liệu mới.

Như một ví dụ của việc sử dụng cla():

import matplotlib.pyplot as plt 
import numpy as np 

images = np.random.uniform(0, 255, size=(40, 50, 50)) 

fig, ax = plt.subplots() 

fig.show() 
for image in images: 
    ax.imshow(image) 
    fig.canvas.draw() 
    ax.cla() 

Và như một ví dụ về chỉ thiết lập các dữ liệu:

import matplotlib.pyplot as plt 
import numpy as np 

images = np.random.uniform(0, 255, size=(40, 50, 50)) 

fig, ax = plt.subplots() 

im = ax.imshow(images[0]) 
fig.show() 
for image in images[1:]: 
    im.set_data(image) 
    fig.canvas.draw() 

Bạn sẽ nhận thấy rằng phương pháp thứ hai là nhanh hơn đáng kể.

Các vấn đề liên quan