Làm cách nào để chạy mã Python trong trình biên dịch C?

rất nhiều người sử dụng Cython để biên dịch mã python của họ trong C để tăng hiệu suất. Nó rất dễ làm và có thể là thứ mà bạn muốn tận dụng

Đảm bảo rằng bạn đã cài đặt Cython trước

Quá trình tổng thể diễn ra như thế này

  • Mang các phần mã của bạn mà bạn muốn chuyển đổi sang c thành một tệp riêng
  • Cung cấp thông tin về loại và cho Cython biết những gì bạn muốn sử dụng trong Python và những gì bạn không sử dụng
  • biên dịch tệp riêng biệt bằng cách sử dụng thiết lập. tập tin py

Trong ví dụ này, giả sử chúng ta muốn biên dịch hàm này thành C

def AddToTen[]:
x = 0
for i in range[1,11]:
x+=i
return x

Điều đầu tiên chúng ta cần làm là di chuyển cái này từ một. tập tin py vào một. pyx, đó là những gì Cython sử dụng. Bây giờ chúng tôi sẽ cung cấp thông tin loại cho các biến của chúng tôi

Bạn muốn đọc câu chuyện này sau?

trong Cython, có ba câu lệnh def

  • cdef. khai báo thứ gì đó sẽ chỉ được sử dụng trong c [như các biến bên trong hàm của chúng ta]
  • pdef. khai báo thứ gì đó sẽ chỉ được sử dụng trong Python
  • cpdef. tuyên bố một cái gì đó điều này sẽ được sử dụng trong cả hai
cpdef int AddToTen[]:
cdef int x = 0
cdef int i
for i in range[1,11]:
x+=i
return x

Vì tôi sẽ không gọi các biến bên trong hàm của chúng ta trong Python, nên tôi đã sử dụng cdef, nhưng đối với chính hàm đó, tôi đã sử dụng cpdef

Ngoài ra, lưu ý rằng chúng tôi đã nhập I trong vòng lặp for và hàm vì nó trả về một int

Bây giờ chúng ta phải biên dịch. pyx. Trong một tệp riêng biệt [của tôi có tên là setup. py], hãy viết đoạn mã sau

from distutils.core import setup
from Cython.Build import cythonize
setup[ext_modules = cythonize['The_Name_Of_Your_Pyx_Here.pyx']]

Cuối cùng, trong terminal [đảm bảo rằng bạn đang ở trong cùng một thư mục], hãy chạy dòng

python setup.py build_ext --inplace

Điều này sẽ biên dịch pyx của bạn và bạn sẽ thấy một tệp có cùng tên với phần mở rộng. c thay vì pyx

Giờ đây, bạn có thể nhập các hàm c của mình vào các tệp python cục bộ, với điều kiện là bạn đã sử dụng cpdef, chỉ bằng cách nhập 'tên tệp của bạn'. Các IDE có xu hướng đưa ra lỗi nhập cho tôi mặc dù chúng đã nhập tốt. Bạn cũng có thể nhập các thư viện python vào tệp pyx, nhưng theo kinh nghiệm của tôi, nó hoạt động giống như trong Python

Tuy nhiên, Python có một nhược điểm lớn. Nó chậm hơn nhiều so với các ngôn ngữ được biên dịch như C hoặc C++. Vì vậy, chúng ta sẽ làm gì sau khi thử nghiệm một ý tưởng bằng cách xây dựng một nguyên mẫu Python và bây giờ chúng ta muốn biến nó thành một công cụ nhanh và hiệu quả? . Sẽ thật tuyệt nếu bản thân nguyên mẫu Python của chúng ta có thể chạy nhanh hơn phải không?

May mắn thay, tôi tình cờ tìm ra một giải pháp cho vấn đề. PyPy, một giải pháp thay thế nhanh cho Python

Để minh họa mức độ tăng tốc mà PyPy có thể cung cấp, tôi đã chạy cả trình thông dịch Python mặc định và PyPy trong ví dụ sau

Về cơ bản, tập lệnh cộng tất cả các số nguyên trong khoảng từ 0 đến 100.000.000 trong một vòng lặp và in một thông báo cũng như thời gian chạy của tập lệnh bất cứ khi nào hoàn thành

Dù không phải là đánh giá khoa học nhưng ví dụ minh họa vẫn khiến bạn phải suy nghĩ. So với trình thông dịch Python mặc định, cần khoảng 10 giây, PyPy hoàn thành việc thực thi chỉ sau hơn 0 giây. 22 giây. Ngoài ra, lưu ý rằng chúng tôi chỉ có thể cung cấp mã Python của mình cho PyPy mà không có bất kỳ thay đổi nào. Kết quả thậm chí còn ấn tượng hơn khi bạn so sánh nó với C, bậc thầy về tốc độ. Trên máy tính của tôi, việc triển khai tương đương trong C mất 0. 32 giây. Mặc dù C vẫn là bậc thầy về tốc độ nói chung, PyPy có thể đánh bại C trong một số trường hợp

“Nếu bạn muốn mã của mình chạy nhanh hơn một cách kỳ diệu, có lẽ bạn chỉ nên sử dụng PyPy. ”
— Guido van Rossum [người tạo ra Python]
Nguồn. youtube. be/2wDvzy6Hgxg?t=1012

PyPy kém hiệu quả hơn khi chương trình của chúng tôi vẫn nhanh hoặc khi phần lớn thời gian chạy được dành cho các lệnh gọi đến các thư viện không phải python. Tuy nhiên, nếu chúng ta có một chương trình chậm, trong đó phần lớn thời gian dành để thực thi mã Python, thì PyPy có thể làm nên điều kỳ diệu

Tại sao PyPy lại nhanh như vậy?

Đây là câu hỏi mà bạn có thể tự hỏi nếu lần đầu tiên bạn tình cờ biết đến PyPy và đúng như vậy. Có vẻ như ma thuật ngay từ đầu. Chúng tôi đang chạy chính xác cùng một đoạn mã và với PyPy, chúng tôi nhận được sự tăng tốc lớn dường như miễn phí

Mặc dù mã hoàn toàn giống nhau, nhưng cách mã được thực thi không thể khác hơn. Bí mật đằng sau việc tăng hiệu suất của PyPy là biên dịch đúng lúc, viết tắt là biên dịch JIT

Nhưng hãy từ từ

Tổng hợp trước thời gian

Các ngôn ngữ lập trình như C, C++ cũng như Swift, Haskell, Rust và nhiều ngôn ngữ khác được biên dịch trước thời hạn. Điều này có nghĩa là sau khi bạn viết một số mã bằng các ngôn ngữ đó, bạn nhấn một nút và trình biên dịch sẽ chuyển đổi mã nguồn thành mã mà máy có thể đọc được, có thể đọc được bởi một kiến ​​trúc máy tính cụ thể. Bất cứ khi nào chương trình được thực thi, mã nguồn gốc của bạn đã biến mất từ ​​​​lâu. Tất cả những gì được thực thi là mã máy

Ahead-of-Time Compilation chuyển đổi các tệp nguồn thành mã máy

Phiên dịch ngôn ngữ

Python, JavaScript, PHP và các ngôn ngữ tương tự có cách tiếp cận khác. Chúng được diễn giải. So với chuyển mã nguồn sang mã máy thì vẫn giữ nguyên mã nguồn. Mỗi khi chương trình được chạy, một trình thông dịch sẽ “xem xét” từng dòng mã và chạy nó cho chúng ta

Một thông dịch viên chạy chương trình theo từng dòng

Trong trường hợp của JavaScript, một trình thông dịch được tích hợp vào mọi trình duyệt web. Trình thông dịch Python chuẩn được gọi là CPython. Tuy nhiên, điều rất quan trọng là phải phân biệt giữa ngôn ngữ Python và thứ chạy mã của chúng tôi, CPython. Đó là bởi vì chúng ta có thể có các công cụ hoàn toàn khác nhau với khả năng chạy mã Python. Đây là nơi PyPy đi vào hình ảnh

Tổng hợp đúng lúc

PyPy là một triển khai thay thế của Python khai thác quá trình biên dịch đúng lúc. Điều đang xảy ra là PyPy bắt đầu giống như một trình thông dịch chạy mã Python của chúng tôi trực tiếp từ các tệp nguồn. Tuy nhiên, thay vì chạy từng dòng mã, PyPy biên dịch các phần của mã thành mã máy ngay trước khi nó thực thi chúng, đúng lúc để nói

Biên dịch JIT kết hợp biên dịch và giải thích trước thời hạn

Theo nghĩa này, biên dịch JIT là sự kết hợp giữa diễn giải và biên dịch trước thời hạn. Chúng tôi đạt được sự gia tăng hiệu suất của quá trình biên dịch trước thời hạn cũng như tính linh hoạt và khả dụng đa nền tảng của các ngôn ngữ được thông dịch

Làm thế nào bạn có thể hưởng lợi từ PyPy?

Bây giờ chúng tôi đã hiểu cách PyPy đạt được mức tăng hiệu suất đáng kinh ngạc, chúng tôi muốn sử dụng nó. PyPy được cung cấp miễn phí tại pypy. org và dễ cài đặt. Ngoài bản thân công cụ, trang web còn chứa nhiều mẹo và thủ thuật để tinh chỉnh chương trình python của bạn để tăng hiệu suất hơn nữa. Vì PyPy chỉ là một triển khai thay thế của Python, hầu hết thời gian nó chỉ hoạt động vượt trội mà không có bất kỳ thay đổi nào đối với dự án Python của bạn. Nó hoàn toàn tương thích với khung web Django, gói máy tính khoa học Numpy và nhiều gói khác. Nó giúp tôi tiết kiệm vô số thời gian để triển khai lại các nguyên mẫu của mình bằng C và tôi không muốn bỏ lỡ nó trong bộ công cụ lập trình của mình

Tìm thấy câu chuyện này thú vị? . Trung bình. com/@mmsbrggr/thành viên. Bạn sẽ nhận được quyền truy cập vào tất cả Phương tiện và một phần phí thành viên của bạn sẽ hỗ trợ trực tiếp cho bài viết của tôi

Vui lòng liên hệ với tôi nếu có câu hỏi và nhận xét riêng tư trên LinkedIn. Nếu bạn thích bài đăng, hãy để tôi thông báo cho bạn về bản tin của tôi. marcelmoos. com/bản tin

Làm cách nào để chạy mã Python trong C?

Vì vậy, chúng ta sẽ sử dụng quy tắc sau để gọi hàm Python. .
Khởi tạo môi trường Python
Nhập mô-đun Python
Lấy tham chiếu đến hàm Python, để gọi
Kiểm tra xem chức năng có thể được gọi hay không và gọi nó
Sau đó phản đối đối tượng Python được trả về, được trả về bởi hàm, sau khi thực thi

Chúng ta có thể sử dụng mã Python trong C không?

Để viết các mô-đun Python bằng C, bạn cần sử dụng API Python, API này xác định các hàm, macro và biến khác nhau cho phép trình thông dịch Python gọi mã C của bạn. All of these tools and more are collectively bundled in the Python. h header file.

Tôi có thể biên dịch Python bằng GCC không?

Về lý thuyết plugin cho phép bạn viết các tập lệnh Python có thể chạy bên trong GCC khi nó biên dịch mã , hiển thị cấu trúc dữ liệu nội bộ của GCC dưới dạng .

Python có được biên dịch thành C không?

Python là một ngôn ngữ được thông dịch, có nghĩa là mã nguồn của chương trình Python được chuyển đổi thành mã byte, sau đó được thực thi bởi máy ảo Python. Python khác với các ngôn ngữ được biên dịch chính, chẳng hạn như C và C + +, vì mã Python không bắt buộc phải xây dựng và liên kết như mã cho các ngôn ngữ này .

Chủ Đề