2011-08-21 63 views
7

Vì vậy, tôi gặp một chút rắc rối khi xử lý các vòng lặp trong Python - theo như tôi có thể nói, chúng đang chậm dần theo thời gian. Tôi đang looping trên một phạm vi bên trong của một phạm vi, và như thời gian trôi qua, vòng lặp đáng chú ý chậm. Điều này được thực hiện bên trong một công cụ trò chơi, nếu nó quan trọng. Bất cứ ai có thể cho tôi biết vấn đề là gì?Python Đối với vòng lặp chậm với thời gian

Đây là ví dụ nhanh.

for x in range(xs): # xs, ys, and zs are all pre-determined size values 

    for z in range(zs): 

      for y in range(ys): 

       vp = [x * vs, y * vs, z * vs] 

       v = Cube(vp) 

Tốc độ ban đầu của quá trình này là tốt, nhưng với thời gian vòng lặp chậm. Tôi biết nó không phải là bất cứ điều gì khác như Rasterizer của công cụ trò chơi bởi vì khi vòng lặp được thực hiện, phần còn lại của động cơ chạy ở 60 FPS. Vì vậy, những gì có thể là vấn đề?

EDIT: Tôi đang sử dụng Python 3, vì vậy không có xrange.

EDIT 2: Trong ví dụ này, vs là 1.0, và các giá trị kích thước định trước xs, ys, và ZS là tất cả 20.

+5

Thông số vòng lặp ba, xs, ys và zs của bạn lớn bao nhiêu? –

+0

Điều gì sẽ xảy ra nếu bạn nhận xét một trong hai dòng bên trong vòng lặp? – jtbandes

+0

Nếu bạn đang sử dụng python 2.x 'xrange' sẽ nhanh hơn' range' – GWW

Trả lời

13

Đây là một trường hợp "cần thêm thông tin". Tuy nhiên, Python có một cách tiêu chuẩn xây dựng vòng lồng nhau như thế này một cách hiệu quả, itertools.product:

from itertools import product 

for x, y, z in product(xrange(xs), xrange(zs), xrange(ys)): 
    vp = [x * vs, y * vs, z * vs] 
    v = Cube(vp) 

Nó không đòi hỏi việc xây dựng range s mỗi lần ở các vòng trong. Tôi cũng đã chuyển đổi việc sử dụng của bạn là range thành xrange, vì nó tốt hơn cho phạm vi rộng lớn, mặc dù điều này thực sự không liên quan với product.

@ Câu hỏi của JohnZ là tốt - nếu "giá trị kích thước xác định trước" của bạn rất lớn và đặc biệt nếu vs cũng lớn, bạn có thể xây dựng một số giá trị lớn và có thể mất một thời gian dài để xử lý Cube chúng.

Tôi nghi ngờ bản thân vòng lặp đang chậm lại, nhưng các con số đang ngày càng lớn hơn, do đó tính toán của bạn có thể.

+0

so với thực tế là 1.0. – SolarLune

+0

Ngoài ra, 'giá trị kích thước xác định trước' của tôi là, ví dụ này, 20 mỗi giá trị. – SolarLune

+0

Nhưng đó là điều kỳ lạ - vòng lặp nên ở tốc độ ổn định, phải không? Nó chắc chắn nhận được chậm hơn với thời gian đến một điểm ... – SolarLune

1

Ba điều tôi có thể nghĩ:

Memory - nếu bạn đang lưu trữ tất cả các giá trị được tạo ra ở đâu đó, vòng lặp có thể được làm chậm lại vì dung lượng bộ nhớ được sử dụng. Python có trình quản lý bộ nhớ riêng, vì vậy việc sử dụng nhiều bộ nhớ cuối cùng có thể làm cho chương trình chậm hơn.

Tính phức tạp của tính toán - Python sử dụng các loại dữ liệu số chính xác tùy ý. Nếu bạn đang nhân các số cực lớn với nhau (đặc biệt là nổi) chương trình sẽ làm chậm. Nó thực sự phụ thuộc vào cách các giá trị này nhận được.

Cube - Có thể là lỗi trong mã Cube (mặc dù tôi chắc chắn nó có thể đơn giản như âm thanh).

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