2012-12-27 43 views
6

Chúng tôi có thể xây dựng các chuỗi kết cấu cố định nhưng chiều dài tùy ý với nhà điều hành *, với những điều sau:Có thể xử lý một chuỗi lớn tùy ý bằng Python không? (Tạo ra thông qua các nhà điều hành *)

length = 10 
print "0" * length 

này trả gì được mong đợi, 0000000000. Vấn đề phát sinh khi độ dài quá lớn, dẫn đến lỗi tràn:

length = 10000000000000000000000000000000000000000000000 
print "0" * length 

Kết quả này là OverflowError: cannot fit 'long' into an index-sized integer.

Tôi tò mò, có thể một công thức như vậy bằng cách nào đó được sử dụng cho các kích thước có độ dài tùy ý không? Hoặc cách chính xác để xử lý một tình huống là length là gì chưa biết và có thể có giá trị lớn như vậy?

+4

Bạn nhận ra rằng không có hệ thống nào có thể xử lý lượng dữ liệu cần thiết cho một chuỗi như vậy? Số của bạn là 10^46. Đó là cách nhiều dữ liệu hơn Google có hoặc sẽ có. – ThiefMaster

+0

@ThiefMaster Có lẽ, nhưng tôi không nghĩ điều đó là không thể, đó là lý do tại sao tôi đặt ra câu hỏi. Đó là một mối quan tâm hợp lệ để ghi nhớ, mặc dù. – Chris

+2

Tôi tò mò mà vấn đề miền giao dịch với các chuỗi lớn như vậy. –

Trả lời

10

Không, bạn không thể tạo các chuỗi lớn như chuỗi trong ví dụ của mình bằng bất kỳ ngôn ngữ lập trình nào. Các chuỗi chứa từng ký tự. Và 10 byte rất có thể là cách nhiều dữ liệu hơn bất kỳ ai sẽ lưu trữ. Bạn có thể chiếm hơn một nghìn tỷ trung tâm dữ liệu của Google (giả sử Google có 1 YiB bộ nhớ mà chắc chắn không phải là trường hợp ..) và vẫn là có ít hơn đĩa không gian, hãy để một mình RAM là thứ bạn cần cho một chuỗi như vậy.

Để lưu chuỗi lớn như ví dụ của bạn, bạn phải tạo str giống như lớp xử lý __mul__ theo cách lưu trữ số lần lặp lại mà không lưu trữ toàn bộ chuỗi trong bộ nhớ. Rõ ràng việc triển khai này sẽ trở nên cực kỳ phức tạp ngay sau khi bạn cho phép sửa đổi chuỗi đó.

+0

Thú vị, tôi nghĩ rằng đó có thể là cách đơn giản nhất: viết một wrapper quanh lớp chuỗi lưu trữ mẫu ban đầu (được thông qua trong dấu ngoặc kép) và nhân tố nhân. Rõ ràng là bạn không thể lưu trữ chuỗi ở định dạng rõ ràng của nó, nhưng các giá trị có thể của chuỗi rất hạn chế, làm cho nó có thể xử lý được. Rất tuyệt, cảm ơn! Thú vị vấn đề để suy nghĩ về. – Chris

+3

Vui vẻ hỗ trợ các công cụ như 'foo = some_huge_str [: 10 ** 10] + some_huge_str [10 ** 20: 10 ** 30]': p – ThiefMaster

3

Bạn có thể viết một cái gì đó giống như trình tạo chuỗi trong python. Ví dụ:

import sys 

def stringWithArbitraryLength(stringLength): 
    n = 0 
    while n < stringLength: 
     # pattern here 
     if n % 2 == 0: 
      yield "0" 
     else: 
      yield "1" 
     n += 1 

Infinity = float('inf') 

# Usage 1: print the long string 
# for c in stringWithArbitraryLength(Infinity): 
# sys.stdout.write(c) 

# Usage 2: instantiate the long string 
soLong = stringWithArbitraryLength(100000) # output 01010101.... 
print ''.join(soLong) 

# Usage 3: transform the long string 
def transformString(longLongString): 
    for c in longLongString: 
     if c == "1": 
      yield "X" 
     else: 
      yield c 
soLong2 = stringWithArbitraryLength(100000) # output 0X0X0X0X.... 
print ''.join(transformString(soLong2)) 

Nó có một số hạn chế:

  1. Nó chỉ cho phép truy cập tuần tự, không truy cập ngẫu nhiên. Vì vậy, bạn phải sử dụng vòng lặp để đi qua chuỗi.
  2. Mỗi ký tự không thể phụ thuộc vào các ký tự có chỉ số lớn hơn.
  3. Việc lập tức rất khó nếu độ dài lớn. Nhưng bạn có thể thực hiện truy cập ngẫu nhiên sau khi khởi tạo.

Trong nhiều trường hợp, bạn không phải khởi tạo toàn bộ chuỗi. Bởi vì bạn có thể sử dụng dòng IO để làm đầu vào/đầu ra. Và sử dụng máy phát điện để xử lý chuỗi. Vì vậy, mỗi lần bạn chỉ xử lý một phần dữ liệu.

Nếu bạn muốn hiểu thêm về chuỗi dài hoặc dài vô hạn, bạn có thể tìm hiểu một số ngôn ngữ chức năng không nghiêm ngặt, ví dụ: Haskell. Nó đánh giá biểu hiện một cách lười biếng. Danh sách/chuỗi vô cực thường được sử dụng trong các ngôn ngữ này.

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