2009-12-08 33 views
5
#!/usr/bin/python 

import random 
import string 

appendToFile = open("appendedFile", "a") 

# Generator 

for i in range(1, 100000): 

    chars = "".join([random.choice(string.letters) for i in xrange(15)]) 
    chars2 = "".join([random.choice(string.letters) for i in xrange(15)]) 

    appendToFile.write(chars + ":" + chars2 + "\n") 

appendToFile.close() 

Mã được sửa đổi từ this question.Sắp xếp nhanh một tệp lớn qua python

Mã trên tạo 100.000 dòng văn bản ngẫu nhiên theo định dạng STRING: STRING. Tệp văn bản kết quả là 3,1 MB.

Làm cách nào để nhanh chóng sắp xếp bảng chữ cái tệp, sử dụng STRING đầu tiên trong STRING: STRING? Trường hợp không liên quan.

Sắp xếp bong bóng rất chậm, phải không?

+1

Chúng ta có lợi dụng thực tế là nó có thể phù hợp với RAM trên các máy hiện đại hay không. trên các tệp có kích thước không giới hạn? –

+0

Ưu điểm của RAM dư thừa. – torger

Trả lời

5

Điều này rất nhanh (dưới 1 giây trên máy tính của tôi). Nó sử dụng một loại phân biệt chữ hoa chữ thường, giả sử bạn ngụ ý cái gì là "trường hợp không liên quan"?

#!/usr/bin/python 

appendToFile = open("appendedFile", "r") 
sortToFile = open("sortedFile", "w") 

for line in sorted(appendToFile, key = str.lower): 
    sortToFile.write(line) 
+2

Tại sao không chỉ:' ... được sắp xếp (..., key = str.lower) '? –

8

Cách tiếp cận rõ ràng đầu tiên đơn giản là sử dụng tính năng sắp xếp sẵn có trong Python. Đây không phải là những gì bạn có trong tâm trí? Nếu không, tại sao? Chỉ với 100.000 dòng văn bản ngẫu nhiên, loại được tích hợp sẽ rất nhanh.

lst = open("appendedFile", "rt").readlines() 
lst.sort(key=str.lower) 

Xong. Chúng ta có thể làm điều đó như một lớp lót nếu bạn thực sự muốn:

lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower) 

EDIT: Tôi chỉ cần kiểm tra, và strings.letters bao gồm cả chữ hoa và chữ thường. Vì vậy, trên mã được sửa đổi để được phân biệt chữ hoa chữ thường.

EDIT: thêm về sắp xếp bằng Python: http://wiki.python.org/moin/HowTo/Sorting

+0

Nếu không, tại sao? - Mới để python XD. Tôi đã tạo mã đó để bạn có một tệp để làm việc. – torger

+0

FYI, loại được xây dựng trong Python cho danh sách là một loại hợp nhất. Độ phức tạp O (n * log n). – BrainCore

1

Hãy thử điều này (case insensitive):

l=file(appendedFile).readlines() 
l.sort(key=lambda x:x.lower()) 

Đối với các loại kích cỡ optimalisation không phải là thực sự cần thiết (timings trên máy tính chậm của tôi ;-) :

[email protected]:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())" 

real 0m0.615s 
user 0m0.576s 
sys 0m0.024s 
+0

Cảm ơn cơ chế thời gian - không biết nó tồn tại. – torger

+0

Lệnh "thời gian" có sẵn trong Linux. Nó có thể có sẵn dưới Mac OS X. Bạn cũng có thể lấy nó cho Windows nhưng Microsoft đã không xây dựng nó. Cách dễ nhất để có được nó cho Windows là cài đặt Cygwin. Một cách tiếp cận hoàn toàn dựa trên Python, do đó di động, là sử dụng mô-đun "timeit": http://docs.python.org/library/timeit.html – steveha

+0

@CrhistopheD, bạn không cần hàm 'lambda' ; bạn chỉ có thể sử dụng: 'key = str.lower' – steveha

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