2010-03-08 40 views
7

Tôi đang xem qua một số link about generators mà ai đó đã đăng. Ban đầu, anh so sánh hai chức năng dưới đây. Trên thiết lập của mình, ông đã cho thấy một sự gia tăng tốc độ 5% với máy phát điện.Tốc độ máy phát điện trong python 3

Tôi đang chạy Windows XP, python 3.1.1 và dường như không thể sao chép kết quả. Tôi tiếp tục hiển thị "cách cũ" (logs1) nhanh hơn một chút khi được thử nghiệm với nhật ký được cung cấp và tối đa 1GB dữ liệu trùng lặp.

Ai đó có thể giúp tôi hiểu điều gì đang xảy ra khác nhau không?

Cảm ơn!

def logs1(): 
    wwwlog = open("big-access-log") 
    total = 0 
    for line in wwwlog: 
     bytestr = line.rsplit(None,1)[1] 
     if bytestr != '-': 
      total += int(bytestr) 
    return total 

def logs2(): 
    wwwlog = open("big-access-log") 
    bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog) 
    getbytes  = (int(x) for x in bytecolumn if x != '-') 
    return sum(getbytes) 

* chỉnh sửa, khoảng cách sai lầm trong copy/paste

+0

Dường như với tôi, hai chức năng này về cơ bản giống nhau. Trong trường hợp không phải là bạn xây dựng một danh sách lớn, khi bạn có thể đã sử dụng một máy phát điện để thay thế. Vì vậy, tôi không ngạc nhiên khi họ chạy về cùng một tốc độ. – MatrixFrog

+0

Điều đó có ý nghĩa, tôi chỉ tò mò vì sao anh ấy nhận được tốc độ tăng 5% và tôi thấy giảm 1% liên tục. – Will

Trả lời

8

Đối với những gì đáng giá, mục đích chính của so sánh tốc độ trong bản trình bày là chỉ ra rằng việc sử dụng trình tạo không giới thiệu chi phí hiệu năng lớn. Nhiều lập trình viên, khi lần đầu tiên nhìn thấy máy phát điện, có thể bắt đầu tự hỏi về chi phí ẩn. Ví dụ, có tất cả các loại ma thuật kỳ lạ đang diễn ra đằng sau hậu trường không? Việc sử dụng tính năng này có làm cho chương trình của tôi chạy chậm gấp hai lần không?

Nói chung không phải như vậy. Ví dụ này có nghĩa là để cho thấy rằng một giải pháp máy phát có thể chạy với tốc độ tương tự, nếu không nhanh hơn một chút trong một số trường hợp (mặc dù nó phụ thuộc vào tình huống, phiên bản của Python, v.v.). Nếu bạn đang quan sát sự khác biệt lớn về hiệu suất giữa hai phiên bản, thì đó sẽ là điều đáng để nghiên cứu.

+0

Cảm ơn bạn đã trả lời! – Will

0

Bạn không có một câu trả lời một sau gần nửa giờ. Tôi đang đăng một cái gì đó có ý nghĩa với tôi, không nhất thiết phải là câu trả lời đúng. Tôi thấy rằng điều này tốt hơn không có gì sau gần nửa giờ:

Thuật toán đầu tiên sử dụng trình tạo. Một chức năng máy phát điện bằng cách tải page kết quả đầu tiên từ danh sách (vào bộ nhớ) và liên tục tải các trang kế tiếp (vào bộ nhớ) cho đến khi không còn gì để đọc từ đầu vào.

Thuật toán thứ hai sử dụng hai trình tạo, mỗi thuật toán có tuyên bố if cho tổng số hai so sánh trên mỗi vòng lặp thay vì so sánh một thuật toán đầu tiên.

Ngoài ra thuật toán thứ hai gọi hàm sum ở cuối trái ngược với thuật toán đầu tiên chỉ đơn giản là thêm các số nguyên có liên quan khi nó tiếp tục gặp phải chúng.

Như vậy, đối với các đầu vào đủ lớn, thuật toán thứ hai có nhiều so sánh hơn và gọi hàm bổ sung hơn so với đầu tiên. Điều này có thể giải thích tại sao phải mất nhiều thời gian để hoàn thành hơn thuật toán đầu tiên.

Hope this helps

+0

"Thuật toán thứ hai gọi hàm tổng ở cuối trái ngược với thuật toán đầu tiên chỉ đơn giản là thêm các số nguyên có liên quan vì nó tiếp tục gặp phải chúng." Tôi nghĩ * sẽ không có sự khác biệt bởi vì sum() có lẽ không đặt tất cả các giá trị trong bộ nhớ và sau đó thêm chúng. Nó có thể thêm chúng khi nó lặp qua, giống như mã khác. – MatrixFrog

1

Trong slide David Beazley của bạn liên quan đến, ông khẳng định rằng tất cả các cuộc thử nghiệm đã chạy với "Python 2.5.1 trên OS X 10.4.11," và bạn nói rằng bạn đang chạy thử nghiệm với Python 3.1 trên Windows XP. Vì vậy, nhận ra bạn đang làm một số quả táo để so sánh cam. Tôi nghi ngờ về hai biến, phiên bản Python quan trọng hơn nhiều.

Python 3 là một con thú khác với Python 2. Nhiều thứ đã thay đổi dưới mui xe, (ngay cả trong nhánh Python 2). Điều này bao gồm tối ưu hóa hiệu suất cũng như hồi quy hiệu suất (xem, ví dụ: Beazley's own recent blog post on I/O in Python 3). Vì lý do này, các Python Performance Tips bang trang một cách rõ ràng,

Bạn nên thường xuyên kiểm tra những lời khuyên với ứng dụng của bạn và phiên bản của Python bạn định sử dụng chứ không chỉ mù quáng chấp nhận rằng một phương pháp là nhanh hơn khác .

tôi nên đề cập rằng một khu vực mà bạn có thể tin cậy vào máy phát điện giúp là trong việc giảm bộ nhớ tiêu dùng, chứ không phải là tiêu thụ CPU. Nếu bạn có một lượng lớn dữ liệu mà bạn tính toán hoặc trích xuất nội dung nào đó từ từng phần riêng lẻ và bạn không cần dữ liệu sau, máy phát sẽ sáng. Xem generator comprehension để biết thêm chi tiết.

+0

Đã hiểu, tôi nghi ngờ rằng đó là lý do tại sao tôi đăng tôi đã sử dụng python3. Một lần nữa, tôi đã tò mò những gì đang xảy ra khác nhau. – Will

+0

Liên kết tốt, cảm ơn bạn. – Will

+0

Nếu bạn thực sự tò mò, hãy thử chạy thử nghiệm thời gian với cài đặt Python 2.6; nếu điều đó không cung cấp cho bạn sự khác biệt, hãy thử cài đặt Python 2.5 và xem bạn vẫn không thể sao chép kết quả của Beazley được không. Hoặc bạn có thể lười biếng như tôi và chỉ cần thư Python-dev. – gotgenes

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