1. Khách Đăng sai mục 1 lần là banned nhé ! Không nhắc nhở không báo trước nhé !
    Dismiss Notice
  2. Diễn đàn SEO chất lượng, rao vặt miễn phí có PA, DA cao: chuanmen.edu.vn | aiti.edu.vn | okmen.edu.vn | vnmu.edu.vn | dhtn.edu.vn
    Dismiss Notice

Dùng Cython để tăng tốc Python hai vòng lặp lồng nhau lên đến 2196 lần

Thảo luận trong 'Linh Tinh' bắt đầu bởi digi2936, 7/10/19.

XenForohosting
admin

Những nhà tài trợ diễn đàn

>> Gamebai.club - Cổng game bài lớn nhất VN
>> thiet ke nha dep 4 tang
>> mau nha dep gia re
>> Cong ty thiet ke nha dep nhat
>> Thiet ke biet thu vuon
>> nha xinh uy tin
>> Trang bóng đá 188bongda.com

  1. digi2936
    Offline

    digi2936 admin

    (Nhà tài trợ: Tư vấn https://baohiemlienviet.com miễn phí) - Python là tiếng nói lập trình phổ quát nhất hoc lap trinh web hiện giờ. Dễ học, áp dụng phổ thông, thư viện rộng rãi, áp dụng cho xử lý, phân tách dữ liệu hoàn hảo, khiến cho ai, Machine Learning, Deep Learning mà ko dùng Python nhưng đi đáng bóng mà ko với bóng.

    bên cạnh đó nhược điểm của Python là chạy chậm, rất chậm. Những đoạn lệnh nào chạy nhanh, thực ra là Python gọi vào thư viện bao lấy code C hoặc C++ thuần, ví dụ như numpy, pandas, opencv, tensorflow, yolo...

    Để thể nghiệm, khiến Dự án prototype chúng ta có thể dùng Python thuần, nhưng lúc lên production cần tối ưu tốc độ, đôi khi là bảo mật code chúng ta không thể máy móc sử dụng Python mà cần sử dụng thêm kỹ thuật khác nữa. Bài viết này giới thiệu Cython và tận dụng tối đa những thư viện gốc C/C++ để tăng tốc độ.

    tỉ dụ minh hoạ sử dụng OpenCV để mở một ảnh con báo gấm sau đấy sử dụng hai vòng lặp for lồng nhau để chỉnh độ xám từng điểm ảnh. Thí dụ ảnh mang kích thước 769 x 960 thì chúng ta phải thực hành 738,240 động tác chỉnh độ xám cho từng điểm ảnh.

    Bước 1: Hãy clode demo code về
    Bạn cấp thiết Python 3.7.x cài sẵn trên máy tính

    nếu bạn thấy hiện ra hình ảnh con báo gấm là ok ! Code nguyên gốc chưa tối ưu đây. Code học lập trình cho trẻ dùng thư viện numpy, cv2, math, time.
    Trước và sau 2 vòng lặp sẽ với đoạn code để đo thời kì

    Bước 2: Thay np.arange và range, gói đoạn lệnh đổi thay contrast vào hàm
    Ở đoạn code trên, chúng ta với thể thay thế np.arange bằng cú pháp thuần Python là range. Nhờ động tác này chúng ta giảm phụ thuộc vào numpy.
    Tiếp đó gói đoạn logic thay đổi contrast vào hàm def adjust_contrast(img, contrast): việc này chỉ để code dễ đọc thôi chứ ko tăng tốc.
    Chạy lại kết quả là 0.366 giây, nhanh hơn 1.8 lần. Chúng ta vẫn được dạy là Numpy là thư viện xử lý rất là nhanh. Không những thế nó chỉ nhanh đối với các phép toán ma trận nhiều chiều thôi, chứ lệnh thuần tuý như np.arange thì nó sẽ ko bằng hàm range chuẩn của Python đâu.

    Bước 3: dùng Cython
    Để sử dụng Cython, chúng ta cần tách hàm adjust_contrast ra 1 file contrast.pyx, file này hoàn toàn ko nhúng code C, hay tiêu dùng biến kiểu strongly type

    không những thế thêm một file setup.py nội dung như sau.

    Bước 4: Thay hàm Python bằng hàm kiểu C
    Chúng ta cải tiến contrast.pyx thành contrast_c.pyx và setup_c.pyx

    Xem thêm =>> https://mindx.edu.vn/blog/post/ung-dung-python

    Thay def bằng cpdef
    định nghĩa những biến có kiểu tường minh cdef int x, y, width, height

    Bước 5: sử dụng hàm ceil C thay vì hàm ceil của Python
    giả dụ ngó vào file contrast_c.pyx bước 3, chúng ta thấy nó sử dụng 1 hàm math.ceil của Python. Như vậy code biên dịch ra C gọi vào module math của Python. Đây là bí quyết rất thiếu tối ưu, hay tối ưu không dứt điểm. Chúng ta cần bỏ càng phổ quát phụ thuộc vào các module Python trong file pyx, trái lại phải tận dụng tối đa những thư viện C, C++ thuần.
    Đây là contrast_ceil.pyx

    Thay vì sử dụng hàm math.ceil của python chúng ta dùng hàm ceil của C.

    tại sao tốc độ lại nâng cao dữ dội đến vậy 2 vòng lặp lồng nhau sẽ khiến cho một lệnh chạy chậm chạy gấp lên M x N lần. Ví như ảnh cỡ 4 Mega Pixels thì hàm kém tối ưu sẽ là thảm hoạ.

    Bước 6: sử dụng Numpy nhân ma trận
    Đây là bí quyết đúng đắn khôn ngoan nhất bởi Numpy sở hữu sẵn hàm nhân ma trận vô cùng tối ưu. Code lại cực kỳ thuần tuý

    Tổng kết
    hạn chế tối đa việc sử dụng hai vòng lặp lồng nhau lúc xử lý dữ liệu. Phấn đấu thay bằng hàm với sẵn trong Numpy, luôn là tối ưu nhất
    nếu như bắt buộc tiêu dùng vòng lặp, mà ko dùng được Numpy hãy tiêu dùng Cython để tối ưu tốc độ. Tốc độ sẽ cải thiện chí ít là 1.5 lần.

    [​IMG]
     

Chia sẻ trang này