In số dòng python

Cách tiếp cận đơn giản nhất, đối với các tệp có kích thước hợp lý, là đọc tệp dưới dạng danh sách các dòng sao cho số dòng bằng độ dài của danh sách. Nếu đường dẫn của tệp nằm trong một chuỗi được liên kết với biến

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
6, thì đó chỉ là

count = len[open[thefilepath].readlines[  ]]

Đối với một tệp thực sự lớn, điều này có thể rất chậm hoặc thậm chí không hoạt động. Nếu bạn phải lo lắng về các tệp khổng lồ, một vòng lặp sử dụng phương pháp

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
7 luôn hoạt động

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1

Đây là một giải pháp thay thế hơi phức tạp, nếu dấu kết thúc dòng là

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
8 [hoặc có
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
8 làm chuỗi con, như xảy ra trên Windows]

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]

Nếu không có đối số

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
1 thành
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
2, điều này sẽ hoạt động ở mọi nơi, nhưng hiệu suất có thể bị ảnh hưởng nghiêm trọng trên nền tảng Windows hoặc Macintosh

Nếu bạn có một chương trình bên ngoài đếm số dòng của tệp, chẳng hạn như

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
3 trên các nền giống Unix, tất nhiên bạn có thể chọn sử dụng chương trình đó [e. g. , thông qua
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
4]. Tuy nhiên, việc đếm số dòng trong chương trình của bạn thường đơn giản hơn, nhanh hơn và linh hoạt hơn. Bạn có thể dựa vào hầu hết tất cả các tệp văn bản có kích thước hợp lý, do đó việc đọc toàn bộ tệp vào bộ nhớ cùng một lúc là khả thi. Đối với tất cả các tệp bình thường như vậy,
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
5 của kết quả của
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
6 cung cấp cho bạn số lượng dòng theo cách đơn giản nhất

Nếu tệp lớn hơn bộ nhớ khả dụng [ví dụ, vài trăm megabyte trên một PC thông thường hiện nay], giải pháp đơn giản nhất có thể trở nên chậm, vì hệ điều hành phải vật lộn để khớp nội dung của tệp vào bộ nhớ ảo. Nó thậm chí có thể thất bại, khi không gian trao đổi cạn kiệt và bộ nhớ ảo không thể giúp được gì nữa. Trên một PC thông thường, với 256 MB RAM và dung lượng ổ đĩa hầu như không giới hạn, bạn vẫn có thể gặp sự cố nghiêm trọng khi cố gắng đọc các tệp bộ nhớ, chẳng hạn như 1 hoặc 2 GB, tùy thuộc vào hệ điều hành của bạn [một số hệ điều hành có nhiều . Trong trường hợp này, phương thức

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
7 của các đối tượng tệp, được giới thiệu trong Python 2. 1, nói chung là một cách tốt để xử lý từng dòng tệp văn bản. Trong Python 2. 2, bạn có thể làm tốt hơn nữa, cả về độ rõ ràng và tốc độ, bằng cách lặp trực tiếp trên đối tượng tệp

for line in open[thefilepath]: count += 1

Tuy nhiên,

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
7 không trả về một chuỗi và một vòng lặp trực tiếp trên đối tượng tệp, vì vậy bạn không thể chỉ sử dụng
count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
5 trong những trường hợp này để lấy số dòng. Thay vào đó, bạn phải lặp lại và đếm từng dòng, như thể hiện trong giải pháp

Đếm các ký tự kết thúc dòng trong khi đọc tệp theo byte, theo các khối có kích thước hợp lý, là ý tưởng chính trong phương pháp thứ ba. Nó có lẽ là ít trực quan nhất ngay lập tức và nó không hoàn toàn đa nền tảng, nhưng bạn có thể hy vọng rằng nó nhanh nhất [ví dụ: bằng cách tương tự với Công thức 8. 2 trong Sách dạy nấu ăn Perl]

Tuy nhiên, hãy nhớ rằng, trong hầu hết các trường hợp, hiệu suất không thực sự quan trọng lắm. Khi nó thực sự quan trọng, thời gian chìm có thể không như trực giác của bạn nói với bạn, vì vậy bạn không bao giờ nên tin vào trực giác của mình trong vấn đề này—thay vào đó, hãy luôn lấy điểm chuẩn và đo lường. Ví dụ: tôi đã lấy một tệp nhật ký hệ thống Unix điển hình có kích thước trung bình, hơn 18 MB văn bản trong 230.000 dòng

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
1

và tôi đã thiết lập tập lệnh khung chuẩn sau,

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
0

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
3

Đầu tiên, tôi in số lượng dòng thu được bằng tất cả các phương pháp, do đó đảm bảo rằng không có sự bất thường hoặc lỗi [các tác vụ đếm thường dễ bị lỗi từng dòng một]. Sau đó, tôi chạy mỗi phương án 10 lần, dưới sự kiểm soát của chức năng định thời gian

count = 0
thefile = open[thefilepath, 'rb']
while 1:
    buffer = thefile.read[8192*1024]
    if not buffer: break
    count += buffer.count['\n']
thefile.close[  ]
1 và xem kết quả. Họ đây rồi

count = 0
for line in open[thefilepath].xreadlines[  ]: count += 1
5

Như bạn có thể thấy, sự khác biệt về hiệu suất hầu như không quan trọng. sự khác biệt 10% hoặc hơn trong một tác vụ phụ trợ là điều mà người dùng của bạn thậm chí sẽ không bao giờ nhận thấy. Tuy nhiên, cách tiếp cận nhanh nhất [đối với các trường hợp cụ thể của tôi, một PC giá rẻ nhưng rất mới chạy bản phân phối Linux phổ biến, cũng như điểm chuẩn cụ thể này] là kỹ thuật vòng lặp khiêm tốn trên mọi dòng, trong khi cách chậm nhất là kỹ thuật đầy tham vọng . Trong thực tế, trừ khi tôi phải lo lắng về các tệp có dung lượng hàng trăm MB, tôi luôn sử dụng phương pháp đơn giản nhất [tôi. e. , cái đầu tiên được trình bày trong công thức này]

Chủ Đề