2010-05-26 42 views
30

Mô-đun sys của Python provides a functionsetrecursionlimit cho phép bạn thay đổi giới hạn đệ quy tối đa của Python. Các tài liệu nói:Python: Giới hạn đệ quy cứng cho Linux, Mac và Windows là gì?

Giới hạn cao nhất có thể là phụ thuộc vào nền tảng.

Câu hỏi của tôi là: Giới hạn cao nhất có thể cho các nền tảng khác nhau, trong CPython là gì? Tôi muốn biết các giá trị cho Linux, Mac và Windows.

CẬP NHẬT: Chúng ta có thể vui lòng tránh câu trả lời "Bạn đang làm sai" không? Tôi biết rằng cố gắng làm đệ quy rất sâu thường là một ý tưởng tồi. Tôi đã xem xét những ưu và khuyết điểm trong tình hình cụ thể của tôi và quyết định rằng tôi muốn làm điều đó.

+2

Không mà cũng phụ thuộc vào lượng bộ nhớ bạn có, v.v. – Justin

+0

Có khả năng tương đương với "kích thước ngăn xếp setrlimit tối đa có thể có trên {os}" là bao nhiêu. Đối với Linux, tôi đặt cược gần như tất cả RAM của userland của bạn, nhưng tôi không biết. Giá trị có thể được thao tác với 'resource.setrlimit': http://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script –

Trả lời

1

Bạn không nên lạm dụng các cuộc gọi đệ quy trong CPython. Nó không có tối ưu hóa đuôi, các cuộc gọi chức năng sử dụng rất nhiều bộ nhớ và thời gian xử lý. Các giới hạn đó có thể không áp dụng cho các triển khai khác, nó không nằm trong các bản thiết kế.

Trong CPython, đệ quy là tốt cho việc duyệt qua cấu trúc dữ liệu (trong đó giới hạn 1000 là đủ cho mọi người) nhưng không phải cho thuật toán. Nếu tôi thực hiện các thuật toán liên quan đến đồ thị và đạt đến giới hạn đệ quy, tôi sẽ thực hiện ngăn xếp của riêng tôi và sử dụng lặp lại hoặc tìm thư viện được triển khai trong C/C++/bất cứ điều gì trước khi tăng giới hạn bằng tay.

+6

Cảm ơn bạn đã biết thông tin, nhưng đó là một nhận xét sâu sắc hơn câu trả lời . (Và như một câu trả lời, đó là loại "Bạn đang làm sai".) –

+0

Cảm ơn @Xavier. thực tế là, trong nghề này, khá nhiều mọi thứ tôi học được từ người khác là một bóng râm của "bạn đang làm sai". –

+0

Tôi hoàn toàn đồng ý với bạn. Bạn không cần đệ quy. Bạn không cần giới hạn stack. Nếu bạn đang gây ra Stack Overflow, bạn đang làm sai. '= P' –

30

Trên Windows (ít nhất), sys.setrecursionlimit không phải là toàn bộ câu chuyện. Giới hạn cứng là trên cơ sở cho mỗi luồng và bạn cần gọi số threading.stack_size và tạo một chuỗi mới khi bạn đạt đến giới hạn nhất định. (Tôi nghĩ rằng 1MB, nhưng không chắc chắn) Tôi đã sử dụng phương pháp này để tăng nó lên một ngăn xếp 64MB.

import sys 
import threading 

threading.stack_size(67108864) # 64MB stack 
sys.setrecursionlimit(2 ** 20) # something real big 
           # you actually hit the 64MB limit first 
           # going by other answers, could just use 2**32-1 

# only new threads get the redefined stack size 
thread = threading.Thread(target=main) 
thread.start() 

Tôi chưa thử xem giới hạn nào có thể có trên threading.stack_size, nhưng vui lòng thử ... đó là nơi bạn cần tìm.

Tóm lại, sys.setrecursionlimit chỉ là giới hạn được thực thi bởi chính trình thông dịch. threading.stack_size cho phép bạn thao tác với giới hạn thực tế được áp đặt bởi hệ điều hành. Nếu bạn nhấn giới hạn thứ hai đầu tiên, Python sẽ chỉ sụp đổ hoàn toàn.

+0

Tôi nên đặt gì thay cho 'target = main' nếu tôi không có đối tượng 'main'? – mmj

+0

Bạn đặt bất kỳ tên hàm nào ở đó. Nó không phải được gọi là chính. – FogleBird

+0

Bất kỳ giá trị nào tôi đặt làm kích thước ngăn xếp đều không thể giải quyết được vấn đề giới hạn đệ quy của tôi. Tôi biết rằng độ sâu đệ quy thực sự tôi cần là dưới 100k và tôi quản lý để chạy nó dưới Linux, nhưng không phải dưới Windows. – mmj

6
  • Đối với Windows: 2000
  • Đối với Linux: 2147483647 (2^31-1)
  • Đối với Mac, trên Pro giới hạn mặc định MacBook của tôi là: 1000
+2

Nguồn? '' '' '' '' – fabspro

+1

sys.getrecursionlimit() – WhoSayIn

+2

và nhân tiện, vì tôi có MacBook Pro bây giờ, tôi có thể xác nhận rằng giới hạn đệ quy mặc định trên OS X là 1000 – WhoSayIn

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