Con trăn với trăn 3

Bảo vệ mã nguồn Python với Cython [Chống dịch ngược, mã chống lộ] Bảo vệ mã nguồn Python của bạn khỏi các chương trình

Lượt xem 118 Tải xuống 30 Kích thước tệp 811KB

TẢI TẬP TIN

Đề xuất câu chuyện

Xem trước trích dẫn

Bảo vệ mã nguồn Python với Cython [Chống dịch ngược, mã chống lộ] Việc bảo vệ các nguồn Python của bạn khỏi các chương trình dịch ngược không mong muốn, nói dễ hơn làm, bởi vì mã byte. pyc could not be translate. Phải mất một thời gian tôi mới tìm ra một cách thích hợp để ẩn mã Python An Cython, một trình biên dịch tối ưu hóa, lấy các mô-đun. py của bạn và các dịch vụ của họ đã sang các tệp C có hiệu suất cao. Kết quả các tệp C có thể được biên dịch vào các thư viện nhị phân riêng mà không cần nỗ lực. Khi quá trình biên dịch được thực hiện, không có cách nào để đảo ngược các thư viện đã biên dịch trở lại mã nguồn Python có thể đọc được. Cython hỗ trợ cả Python 2 và 3, bao gồm cú pháp async / await hiện đại. Theo kinh nghiệm của tôi, điều duy nhất nó không thể làm được là máy phát không đồng bộ [máy phát điện không đồng bộ]. 1. Cài đặt Cython Cài đặt dễ dàng như nhập "pip install cython" hoặc "pip3 install cython" [đối với Python 3]. 2. Add compile. py Thêm đoạn mã sau vào thư mục dự án của bạn [dưới dạng compile. py]. Nó sẽ hoạt động như một bản makefile khác cho biên dịch. từ distutils. thiết lập nhập lõi từ distutils. nhập tiện ích mở rộng Tiện ích mở rộng từ Cython. Distutils nhập build_ext ext_modules = [ Extension["mymodule1", ["mymodule1. py"]], Tiện ích mở rộng ["mymodule2", ["mymodule2. py"]], #. tất cả các mô-đun của bạn cần được biên dịch. ] setup[ name = 'Tên chương trình của tôi', cmdclass = {'build_ext'. build_ext}, ext_modules = ext_modules ]

Bản ghi nên liệt kê rõ ràng các tệp mà bạn muốn biên dịch. Bạn cũng có thể lùi lại một số tập tin không cần biên dịch, nếu bạn muốn. Chúng vẫn có thể nhập từ các mô-đun nhị phân. 3. Add main. py Tạo tệp Python chính cho ứng dụng của bạn. Bạn sẽ nhập và khởi động tất cả các tệp logic được biên dịch từ đó. Một tệp chính được yêu cầu vì Cython không tạo tệp nhị phân thực thi theo mặc định [mặc dù nó có khả năng], vì vậy bạn sẽ cần một tệp Python giả, trong đó bạn chỉ cần nhập tất cả logic đã biên dịch . It is could not be simple as. từ logic nhập chính chính []

# cái này đến từ một tệp nhị phân được biên dịch

4. Chạy biên dịch. py Tùy thuộc vào phiên bản Python bạn đang sử dụng, hãy chạy. biên dịch python. py build_ext --inplace

… hay, cho Python 3. biên dịch python3. py build_ext --inplace

Lệnh trên sẽ tạo các tệp. so and. c side by the source. py của bạn

File files. c là các nguồn trung gian được sử dụng để tạo các tệp. vì vậy, là các mô-đun nhị phân bạn muốn phân phối. Khi xây dựng trên Windows, các tệp này có thể có phần mở rộng là. dll. [CẤP NHẬT. trong các nhận xét của mọi người đề xuất rằng họ thực sự có phần mở rộng. pyd trên Windows]. You could delete the files. c and. py sau khi xây dựng thành công và chỉ giữ các tệp. Vì thế. Lưu ý rằng các tập tin. vì vậy chứa nền tảng đích trong tên của họ [ví dụ. darwin trên MacOS của tôi]. Rõ ràng, các mô-đun được biên dịch không phải là đa nền tảng. Nếu bạn phân phối chương trình của mình cho người dùng Ubuntu Linux, bạn nên biên dịch nó trên Linux. Nếu không, bạn sẽ không thể tải xuống các phân tích nhị phân này. Vì vậy,

bạn sẽ phải biên dịch một phiên bản mã dành riêng cho nền tảng cho từng nền tảng nền tảng được nhắm mục tiêu của bạn. May mắn thay, có những công cụ như Vagrant có thể giúp giảm tất cả các gánh nặng cài đặt hệ điều hành xuống một vài lệnh đơn giản. Thiết lập môi trường hệ điều hành khác bằng VirtualBox và Vagrant Dưới đây, một ví dụ về cách tôi quản lý để biên dịch dự án của mình trên Ubuntu 16. 04, trong khi sử dụng MacOS. 1. Cài đặt VirtualBox [https. //www. hộp ảo. org/wiki/Downloads ] và Vagrant [https. //www. lang thang. com/ ]. 2. Chạy export VAGRANT_DEFAULT_PROVIDER=virtualbox [bạn có thể thêm nó vào tập lệnh khởi động Bash của mình tại ~/. bash_profile cho tiện]. 3. Chọn một hệ điều hành tại đây. https. //ứng dụng. lang thang. com/hộp/tìm kiếm. Sau đó nhấp vào tab Mới trong phần Cách sử dụng phần. Bạn sẽ tìm thấy hướng dẫn thiết lập và lệnh ở đó. Run the command that in your project project Python

Cuối cùng, chạy "ssh vagrant" để vào bảng điều khiển Ubuntu mới cài đặt [gõ exit để thoát]

cd vào thư mục /vagrant để xem các dự án của bạn. Sau đó thực hiện các bước 1, 4 từ hướng dẫn sách này và bạn đã hoàn thành

Đối với các dự án có chu kỳ xây dựng / phát hành ngắn [xây dựng/phát hành], các bản dựng đa nền tảng có thể được tự động hóa bằng cách sử dụng dịch vụ CI [Tích hợp liên tục], như TravisCI [https. //travis-ci. org/ ], nhưng đó là một câu chuyện cho một bài viết khác. Bài gốc. https. //Trung bình. com/@xpl/protecting-python-sources-using-cythondcd940bb188e

Update. Sau khi viết bài chia sẻ trên Forum Machine Learning, bạn Vũ Hữu Tiệp gợi ý cách sử dụng Numpy tốc độ đúng nhất là nhân ma trận với Numpy để loại bỏ hoàn toàn 2 vòng lặp lồng nhau, tốc độ khi chạy nhân ma trận với Numpy

Python là ngôn ngữ lập trình biến phổ biến nhất hiện nay. Ứng dụng học, ứng dụng đa dạng, thư viện nhiều, ứng dụng xử lý, phân tích dữ liệu tuyệt vời, làm AI, Machine Learning, Deep Learning mà không dùng Python nhưng đáng bóng mà không mang bóng

Tuy nhiên 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 gồm lấy mã C hoặc C++ thuần túy, ví dụ như numpy, pandas, opencv, tensorflow, yolo

Để thí nghiệm, làm dự án nguyên mẫu chúng ta có thể sử dụng Python thuần túy, nhưng khi lên sản xuất cần tốc độ tối đa, đôi khi là bảo mật mã, chúng ta không thể máy móc sử dụng Python mà cần sử dụng thêm các 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 thư viện gốc C/C++ để tăng tốc độ

Ví dụ minh họa sử dụng OpenCV để mở ảnh báo gấm sau đó sử dụng 2 vòng lặp để lồng nhau để điều chỉnh tốc độ xám từng điểm ảnh. Ví dụ ảnh có kích thước 769 x 960 thì chúng ta phải thực hiện 738.240 tác động điều chỉnh độ xám cho từng điểm ảnh.
Mã nguồn chi tiết ở đây https. //github. com/TechMaster/CythonOpenCV
 

Tóm tắtFileThời gianHơnPython thuần + np. arangecontrast. py0. 659 Python thuần + rangecontrast2. py0. 3661. 8 lầnCython, pyx sử dụng Python rawcontrast3. py
độ tương phản. pyx0. 27282. 4 timeCython, pyx function type Ccontrast4. py
contrast_c. pyx0. 07948. 3 timesCython, pyx function type C, used ceil of Ccontrast5. py
contrast_ceil. pyx0. 00032196 timesKhông cần sử dụng Cython, sử dụng numpycontrast6. py0. 0001763744 lần

 

Bước 1. Please clod demo code about

You must have Python 3. 7. x cài đặt sẵn trên máy tính

$ git clone --depth=1 //github.com/TechMaster/CythonOpenCV.git
$ cd CythonOpenCV
$ source venv/bin/activate
$ pip install -r requirements.txt
$ python contrast.py

Nếu bạn thấy hình ảnh báo gấm hiện ra là ok. Mã gốc chưa tối ưu đây. Mã sử ​​dụng thư viện numpy, cv2, toán học, thời gian.
Trước và sau 2 vòng lặp sẽ có đoạn mã để đo thời gian

import numpy as np
import cv2
import math
import time

img = cv2.imread['tiger_low_constrast.jpg', cv2.IMREAD_GRAYSCALE]

height = img.shape[0]
width = img.shape[1]

contrast = 3
start_time = time.time[]
for i in np.arange[height]:
    for j in np.arange[width]:
        a = img.item[i, j]
        b = math.ceil[a * contrast]
        if b > 255:
            b = 255
        img.itemset[[i, j], b]

elapsed_time = time.time[] - start_time
print[elapsed_time]
cv2.imshow['image', img]
cv2.waitKey[0]
cv2.destroyAllWindows[]

Kết quả chạy là 0. 659 giây

Bước 2. thay np. arange and range, package the command phase instead of change into function

Ở đoạn mã trên, chúng ta có thể thay thế np. arange bằng cú pháp thuần Python is range. Nhờ tác động này mà chúng ta giảm phụ thuộc vào numpy.
Tiếp theo đó, đoạn logic của gói thay đổi độ tương phản thành hàm def điều chỉnh_contrast[img, độ tương phản]. việc này chỉ để code dễ đọc thôi chứ không tăng tốc.
Remove results is 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. Tuy nhiên, nó chỉ nhanh chóng đối với những phép toán ma trận nhiều chiều thôi, chứ không phải lệnh đơn giản như np. arange thì it will not by standard range of Python đâu.

import cv2
import math
import time

img = cv2.imread['tiger_low_constrast.jpg', cv2.IMREAD_GRAYSCALE]

def adjust_contrast[img, contrast]:
    height = img.shape[0]
    width = img.shape[1]

    for i in range[height]:
        for j in range[width]:
            a = img.item[i, j]
            b = math.ceil[a * contrast]
            if b > 255:
                b = 255
            img.itemset[[i, j], b]


start_time = time.time[]
adjust_contrast[img, 3]
elapsed_time = time.time[] - start_time

print[elapsed_time]

cv2.imshow['image', img]
cv2.waitKey[0]
cv2.destroyAllWindows[]

Bước 3. Sử dụng Cython

Để sử dụng Cython, chúng ta cần tách hàm điều chỉnh_contrast ra một tệp tương phản. pyx, tập tin này hoàn toàn không nhúng mã C, hay sử dụng biến kiểu mạnh

# cython: language_level=3, boundscheck=False
# Chưa tối ưu triệt để, chỉ biên dịch ra C
import cv2
import math

def adjust_contrast[img, contrast]:
    height = img.shape[0]
    width = img.shape[1]

    for i in range[height]:
        for j in range[width]:
            a = img.item[i, j]
            b = math.ceil[a * contrast]
            if b > 255:
                b = 255
            img.itemset[[i, j], b]

Ngoài ra, thêm một tập tin thiết lập. py content as after

from distutils.core import setup
from Cython.Build import cythonize

setup[
    ext_modules=cythonize["contrast.pyx"]
]

To compile file contrast. pyx only to enter command. Kết quả sẽ biên dịch ra tệp tương phản. cpython-37m-darwin. Vì thế

$ python setup.py build_ext --inplace

Chạy tệp tương phản3. py has import contrast compile by Cython in the step on

import cv2
import time
import contrast

img = cv2.imread['tiger_low_constrast.jpg', cv2.IMREAD_GRAYSCALE]

start_time = time.time[]

contrast.adjust_contrast[img, 3]

elapsed_time = time.time[] - start_time
print[elapsed_time]

cv2.imshow['image', img]
cv2.waitKey[0]
cv2.destroyAllWindows[]

Kết quả chạy sau khi sử dụng Cython là 0. 2728 giây. Nhanh hơn cách ở bước 1 là 2. 4 lần, cách bước 2 là 1. 3 lần

Bước 4. Thay hàm Python bằng hàm kiểu C

Chúng ta cải tiến tương phản. pyx to contrast_c. pyx và setup_c. pyx

  • Thay def bằng cpdef
  • Định nghĩa các biến với kiểu tường minh cdef int x, y, width, height
# cython: language_level=3, boundscheck=False

import cv2
import math

cpdef unsigned char[:, :] adjust_contrast[unsigned char[:, :] img, float contrast]:
    cdef int x, y, width, height
    height = img.shape[0]
    width = img.shape[1]
    for y in range[height]:
        for x in range[width]:
            b = math.ceil[img[y, x] * contrast]
            if b > 255:
                b = 255
            img[y, x] = b

    return img

The time pull down but 0. 0794 giây, nhanh hơn cách 1 là 8. 3 lần. Rõ ràng nhiều mức độ cải thiện rõ ràng

Bước 5. Use ceil function C instead of ceil function of Python

Nếu nhìn vào tập tin contrast_c. pyx bước 3, chúng ta thấy nó sử dụng một hàm toán học. trần của Python. Như vậy code biên dịch ra C call to module math của Python. Đây là cách rất thiếu tối ưu, hay tối ưu không có điểm hạn chế. Chúng ta cần loại bỏ càng nhiều phụ thuộc vào các mô-đun Python trong tệp pyx, đảo ngược phải tận dụng tối đa các thư viện C, C++ thuần túy.
Đây là contrast_ceil. pyx

Thay vì sử dụng hàm toán học. ceil of python we use ceil function of C

________số 8

Mã sau khi cải tiến, chỉ chạy còn 0. 0003 giây. Tốc độ tăng lên 2196 lần so với lần đầu tiên

Tại sao tốc độ lại tăng dữ liệu dội đến vậy 2 vòng lặp lồng nhau sẽ tạo ra một lệnh chạy chậm chạy gấp lên M x N lần. Nếu ảnh cỡ 4 Mega Pixels thì hàm kém tối ưu sẽ là thảm họa

Bước 6. Use Numpy kernel

Đây là cách đúng đắn để không ngoan nhất bởi Numpy có sẵn hàm nhân ma trận cực kỳ tối ưu. Mã lại tất cả các đơn giản

Chủ Đề