Hướng dẫn is python compiled to c? - python được biên dịch thành c?

Tôi đọc rằng một số cấu trúc của Python hiệu quả hơn vì chúng được biên soạn trong C.

Đo không phải sự thật.

Trước hết, không có gì trong đặc điểm kỹ thuật của ngôn ngữ Python yêu cầu một số chức năng nhất định phải được thực hiện bằng một ngôn ngữ nhất định. Người thực hiện Python có thể chọn thực hiện bất kỳ chức năng và cấu trúc ngôn ngữ nào anh ta muốn. Ví dụ, trong Jython, các chức năng đó được thực hiện trong Java, không phải ở C. Trong Ironpython, chúng được triển khai trong C#. Trong Pypy, chúng có thể được thực hiện trong RPython hoặc chỉ trong Python. Ở Pynie, có lẽ họ được thực hiện trong Python.

Seondly, không có gì trong đặc điểm kỹ thuật của ngôn ngữ C nói rằng nó phải được biên dịch. Có phiên dịch cho C.

Thứ ba, chỉ vì nó ở C không có nghĩa là nó nhanh. Có các trình biên dịch C ngoài kia tạo ra mã thực sự khủng khiếp và có những triển khai Python khá nhanh.

Và thứ tư, ngay cả khi chức năng được thực hiện trong C rất nhanh, điều đó không nhất thiết phải chuyển thành tốc độ thực hiện nhanh hơn của chương trình tổng thể. Tối ưu hóa thường không hoạt động trên các ngôn ngữ. Ví dụ: trình tối ưu hóa không thể nội tuyến cuộc gọi đến map vào chương trình của bạn, vì chương trình của bạn được viết bằng Python nhưng map được viết bằng C. nhưng nội tuyến là nền tảng của tất cả các tối ưu hóa, bởi vì việc không thể kiểm soát được Những con đường dài thẳng của mã không có nhánh hoặc cuộc gọi, đó là những gì tối ưu hóa yêu thích.

Nó thường được giải thích,

Trên thực tế, tất cả các triển khai Python hiện có luôn luôn biên dịch mã Python, họ không bao giờ giải thích nó.

Tại sao không chỉ tổng hợp toàn bộ?

Đó là một câu hỏi hay! Viết mọi thứ bằng cùng một ngôn ngữ có nhiều lợi thế, một số trong đó tôi đã nêu ở trên. (Một điều khác là dễ dàng tìm thấy các cộng tác viên biết một ngôn ngữ hơn hai.)

Nếu mọi thứ được viết bằng cùng một ngôn ngữ, thì các cải tiến hiệu suất cho ngôn ngữ đó sẽ được nhân lên toàn bộ hệ thống. Nếu mọi thứ được viết bằng C, thì làm cho Python nhanh hơn gấp 10 lần sẽ không tăng tốc chương trình của bạn nhiều, bởi vì hầu hết các mã không phải là Python. Chắc chắn, mã bạn đã viết đang chạy nhanh hơn 10 lần, nhưng mã đó chủ yếu bao gồm các cuộc gọi đến các chức năng C có cùng tốc độ như trước đây.

Nhưng nếu mọi thứ được viết bằng Python, thì làm cho Python nhanh hơn sẽ có hiệu ứng gợn sóng: Các loại nguyên thủy sẽ nhanh hơn, các cơ sở dữ liệu được xây dựng trên các loại nguyên thủy đó nhanh hơn, các thuật toán sử dụng các cơ sở dữ liệu đó sẽ nhanh hơn, các mô -đun sử dụng các thuật toán đó nhanh hơn và như vậy.

Một siêu của Python biên dịch thành C, Cython kết hợp sự dễ dàng của Python và tốc độ của mã gốc

Nhà văn cao cấp, Infoworld |InfoWorld |

Hướng dẫn is python compiled to c? - python được biên dịch thành c?
ThinkStock

Mục lục

Cho xem nhiều hơn

Python có tiếng là một trong những ngôn ngữ lập trình thuận tiện nhất, được trang bị phong phú nhất và hết sức hữu ích. Tốc độ thực thi? Không nhiều lắm.

Nhập Cython. Ngôn ngữ Cython là một superset của Python biên dịch thành C, năng suất & nbsp; Hiệu suất tăng cường có thể dao động từ một vài phần trăm đến một số đơn đặt hàng, tùy thuộc vào nhiệm vụ trong tay. Đối với công việc bị ràng buộc bởi các loại đối tượng bản địa của Python, các tốc độ đã giành được rất lớn. Nhưng đối với các hoạt động số, hoặc bất kỳ hoạt động nào không liên quan đến nội bộ của Python, thì lợi nhuận có thể rất lớn. & NBSP;

Với Cython, bạn có thể bỏ qua nhiều giới hạn bản địa của Python, hoặc vượt qua chúng hoàn toàn mà không cần phải từ bỏ sự dễ dàng và thuận tiện của Python. Trong bài viết này, chúng tôi sẽ đi qua các khái niệm cơ bản đằng sau Cython và tạo ra một ứng dụng Python đơn giản sử dụng Cython để tăng tốc một trong những chức năng của nó.

Biên dịch python với c

Mã Python có thể thực hiện các cuộc gọi trực tiếp vào các mô -đun C. Các mô -đun C này có thể là thư viện C chung hoặc thư viện được xây dựng đặc biệt để hoạt động với Python. Cython tạo ra loại mô -đun thứ hai: các thư viện C mà & nbsp; nói chuyện với nội bộ Python, và có thể được gói với mã Python hiện có.

Mã Cython trông rất giống mã Python, theo thiết kế. Nếu bạn cung cấp cho trình biên dịch Cython, một chương trình Python (Python 2.x và Python 3.x đều được hỗ trợ), Cython sẽ chấp nhận nó, nhưng không có gia tốc bản địa nào của Cython sẽ phát huy tác dụng. Nhưng nếu bạn trang trí mã Python với các chú thích loại trong & nbsp; Cython, cú pháp đặc biệt, Cython sẽ có thể thay thế các tương đương nhanh C cho các đối tượng Python chậm.

Lưu ý rằng cách tiếp cận của Cython là & nbsp; gia tăng. Điều đó có nghĩa là một nhà phát triển có thể bắt đầu với một ứng dụng Python hiện tại và tăng tốc bằng cách thực hiện các thay đổi tại chỗ đối với mã, thay vì viết lại toàn bộ ứng dụng từ đầu.

Cách tiếp cận này phù hợp với bản chất của các vấn đề hiệu suất phần mềm nói chung. Trong hầu hết các chương trình & nbsp;, phần lớn mã chuyên sâu CPU tập trung trong một vài điểm nóng, một phiên bản của nguyên tắc Pareto, còn được gọi là quy tắc 80/20/20. Do đó, hầu hết các mã trong một ứng dụng Python không cần phải được tối ưu hóa hiệu suất, chỉ là một vài phần quan trọng. & NBSP; bạn có thể dịch tăng dần các điểm nóng đó thành Cython và do đó, nhận được mức tăng hiệu suất mà bạn cần ở nơi quan trọng nhất. Phần còn lại của chương trình có thể vẫn ở Python để thuận tiện cho các nhà phát triển.

Cách sử dụng Cython

Hãy xem xét mã sau, được lấy từ tài liệu Cython,:

def f(x):
    return x**2-x

def integrate_f(a, b, N):
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f(a+i*dx)
    return s * dx

Đây là một ví dụ đồ chơi, một triển khai không hiệu quả của một chức năng tích hợp. Như mã Python thuần túy, nó chậm, & nbsp; vì Python phải chuyển đổi qua lại giữa các loại số bản địa và các loại đối tượng bên trong của chính nó.

Bây giờ hãy xem xét phiên bản Cython của cùng một mã, với các bổ sung Cython đã nhấn mạnh:

cdef double f(double x):
    return x**2-x

def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, x, dx
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f(a+i*dx)
    return s * dx

Nếu chúng ta khai báo rõ ràng các loại biến, cả cho các tham số hàm và các biến được sử dụng trong phần thân của hàm (double, int, v.v.) Các chức năng được thực hiện chủ yếu trong C cho tốc độ bổ sung, mặc dù các chức năng đó chỉ có thể được gọi bởi các hàm Cython khác chứ không phải bởi các tập lệnh Python. Trong ví dụ trên, chỉ integrate_f có thể được gọi bằng một tập lệnh Python khác, bởi vì nó sử dụng def; ________ 6 & nbsp; các chức năng không thể được truy cập từ Python vì chúng là C thuần túy và không có giao diện Python.

Lưu ý mức độ ít thực tế của chúng tôi & nbsp; mã đã thay đổi. Tất cả những gì chúng tôi đã thực hiện là thêm khai báo loại vào mã hiện có để có được hiệu suất tăng đáng kể.

Ưu điểm của Cython

Ngoài việc có thể tăng tốc mã mà bạn đã viết, Cython cấp một số lợi thế khác:

Làm việc với các thư viện C bên ngoài có thể nhanh hơn

Các gói Python như các thư viện NUMPY WRAP C trong giao diện Python để làm cho chúng dễ làm việc. Tuy nhiên, đi qua lại giữa Python và C thông qua những người bao bọc đó có thể làm mọi thứ chậm lại. Cython cho phép bạn nói chuyện trực tiếp với các thư viện cơ bản mà không có Python trên đường. (Thư viện C ++ cũng được hỗ trợ.)

Bạn có thể sử dụng cả quản lý bộ nhớ C và Python

Nếu bạn sử dụng các đối tượng Python, chúng được quản lý bộ nhớ và thu hút rác giống như trong Python thông thường. Nhưng nếu bạn muốn tạo và quản lý các cấu trúc cấp C của riêng mình và sử dụng ____ 10/________ 11 để làm việc với chúng, bạn có thể làm như vậy. Chỉ cần nhớ dọn dẹp sau khi chính mình.

Bạn có thể chọn an toàn hoặc tốc độ khi cần thiết & nbsp;

Cython tự động thực hiện kiểm tra thời gian chạy cho các vấn đề phổ biến xuất hiện trong C, chẳng hạn như truy cập ngoài giới hạn trên một mảng, bằng cách trang trí và chỉ thị trình biên dịch (ví dụ: ____ 12). An toàn hơn theo mặc định so với mã C cán tay, mặc dù có khả năng phải trả giá bằng hiệu suất thô.

Nếu bạn tự tin rằng bạn đã thắng cần những kiểm tra đó vào thời gian chạy, bạn có thể vô hiệu hóa chúng để tăng tốc độ, trên toàn bộ mô -đun hoặc chỉ trên các chức năng chọn lọc.

Cython cũng cho phép bạn truy cập tự nhiên các cấu trúc Python sử dụng giao thức bộ đệm để truy cập trực tiếp vào dữ liệu được lưu trữ trong bộ nhớ (không sao chép trung gian). Bộ nhớ của Cython & nbsp; cho phép bạn làm việc với các cấu trúc đó ở tốc độ cao và với mức độ an toàn phù hợp với nhiệm vụ. Thời gian chạy Python (chậm).

Mã Cython C có thể được hưởng lợi từ việc phát hành Gil

Khóa thông dịch viên toàn cầu của Python, hoặc Gil, đồng bộ hóa các chủ đề trong phiên dịch viên, bảo vệ quyền truy cập vào các đối tượng Python và quản lý sự tranh chấp về tài nguyên.

Nếu bạn có một phần mã không có tài liệu tham khảo nào về các đối tượng Python và thực hiện một hoạt động chạy dài, bạn có thể đánh dấu nó bằng Chỉ thị & NBSP; ____ 13 để cho phép nó chạy mà không cần Gil. Điều này giải phóng người phiên dịch Python để làm những việc khác trong thời gian tạm thời và cho phép mã Cython sử dụng nhiều lõi (với công việc bổ sung).

Cython có thể sử dụng cú pháp gợi ý loại Python & NBSP;

Python & nbsp; có cú pháp gõ kiểu được sử dụng chủ yếu bởi các trình kiểm tra lin và mã mã, thay vì trình thông dịch CPython. Cython có cú pháp tùy chỉnh riêng cho trang trí mã, nhưng với các bản sửa đổi gần đây của Cython, bạn có thể sử dụng cú pháp Python Type-Hinta để cung cấp các gợi ý loại cơ bản cho Cython. Được gọi là "Chế độ Pure-Python", nó không cho phép toàn bộ các tính năng của Cython, nhưng đủ trong số đó để bạn có thể hoàn thành nhiều tác vụ giống nhau với các ký hiệu ít khó xử hơn. & NBSP; Đọc thêm về cách sử dụng chế độ Pure-Python Trong bài viết riêng của chúng tôi.

Cython có thể được sử dụng để che khuất mã python nhạy cảm

Các mô -đun Python rất dễ phân hủy và kiểm tra, nhưng các nhị phân được biên dịch thì không. Khi phân phối ứng dụng Python cho người dùng cuối, nếu bạn muốn bảo vệ một số mô -đun của nó khỏi rình mò thông thường, bạn có thể làm như vậy bằng cách biên dịch chúng với Cython.

Tuy nhiên, lưu ý, đây là một tác dụng phụ của khả năng Cython, không phải là một trong những chức năng dự định của nó. Ngoài ra, không thể phân hủy hoặc kỹ thuật đảo ngược một nhị phân nếu một người được dành riêng hoặc đủ xác định. Và theo nguyên tắc chung, bí mật, chẳng hạn như mã thông báo hoặc thông tin nhạy cảm khác, không bao giờ được ẩn giấu trong các nhị phân - chúng thường dễ dàng vạch trần với một bãi Hex đơn giản.

Hạn chế Cython

Hãy nhớ rằng Cython là một cây đũa thần. Nó không tự động biến mọi thể hiện của mã Python Poky thành mã C nhanh. Để tận dụng tối đa Cython, bạn phải sử dụng nó một cách khôn ngoan và hiểu những hạn chế của nó:

Little Speedup cho mã Python thông thường

Khi Cython gặp mã Python, nó có thể dịch hoàn toàn thành C, nó sẽ chuyển đổi mã đó thành một loạt các cuộc gọi C sang nội bộ Python. Số tiền này để đưa trình thông dịch Python ra khỏi vòng lặp thực thi, điều này mang lại cho mã tốc độ tăng tốc 15 đến 20 phần trăm khi mặc định. Lưu ý rằng đây là một trường hợp tốt nhất; Trong một số tình huống, bạn có thể thấy không có cải thiện hiệu suất, hoặc thậm chí là suy thoái hiệu suất.

Little Speedup cho các cấu trúc dữ liệu Python bản địa

Python cung cấp một loạt các cấu trúc dữ liệu, các danh sách, danh sách, bộ dữ liệu, từ điển, v.v. Họ rất thuận tiện cho các nhà phát triển và họ đi kèm với quản lý bộ nhớ tự động của riêng họ. Nhưng họ chậm hơn Pure C.

Cython cho phép bạn tiếp tục sử dụng tất cả các cấu trúc dữ liệu Python, mặc dù không có nhiều tốc độ. Điều này, một lần nữa, bởi vì Cython chỉ đơn giản gọi các API C trong thời gian chạy Python tạo ra và thao túng các đối tượng đó. Do đó, các cấu trúc dữ liệu Python hoạt động giống như mã python được tối ưu hóa trên Cython nói chung: đôi khi bạn có được sự tăng cường, nhưng chỉ một chút. & Nbsp; để có kết quả tốt nhất, sử dụng các biến C và cấu trúc. Tin tốt là Cython giúp bạn dễ dàng làm việc với họ.

Mã cython chạy nhanh nhất khi là tinh khiết c ”

Nếu bạn có một chức năng trong C được dán nhãn từ khóa cdef, với tất cả các biến và chức năng nội tuyến của nó đến những thứ khác là C thuần túy, nó sẽ chạy nhanh như C có thể đi. Nhưng nếu chức năng đó tham chiếu bất kỳ mã bản địa Python nào, như cấu trúc dữ liệu Python hoặc cuộc gọi đến API Python nội bộ, cuộc gọi đó sẽ là nút cổ chai hiệu suất.

May mắn thay, Cython cung cấp một cách để phát hiện ra những tắc nghẽn này: A & NBSP; Báo cáo mã nguồn & nbsp; hiển thị trong nháy mắt phần nào trong ứng dụng Cython của bạn là C thuần túy và các phần tương tác với Python. Ứng dụng tối ưu hóa tốt hơn, càng ít tương tác với Python.

Hướng dẫn is python compiled to c? - python được biên dịch thành c?
Idg

Một báo cáo mã nguồn được tạo cho một ứng dụng Cython. Các khu vực màu trắng là C thuần khiết; Các khu vực trong màu vàng cho thấy sự tương tác với nội bộ Python. Một chương trình Cython được tối ưu hóa tốt sẽ có ít màu vàng nhất có thể. Dòng cuối cùng được mở rộng cho thấy mã C làm trung gian mã Cython tương ứng của nó.

Cython Numpy & NBSP;

Cython cải thiện việc sử dụng các thư viện số thứ ba dựa trên C như Numpy. Bởi vì mã Cython biên dịch thành C, nó có thể tương tác trực tiếp với các thư viện đó và đưa các tắc nghẽn Python ra khỏi vòng lặp.

Nhưng Numpy, đặc biệt, hoạt động tốt với Cython. Cython có sự hỗ trợ bản địa cho các công trình cụ thể trong Numpy và cung cấp quyền truy cập nhanh vào các mảng numpy. Và cùng một cú pháp Numpy quen thuộc mà bạn sử dụng trong tập lệnh Python thông thường có thể được sử dụng trong Cython AS-IS.

Tuy nhiên, nếu bạn muốn tạo các ràng buộc gần nhất có thể giữa Cython và Numpy, bạn cần trang trí thêm mã với cú pháp tùy chỉnh Cython. Ví dụ, câu lệnh & nbsp; ____ 15 cho phép mã Cython xem các cấu trúc cấp C trong các thư viện tại thời điểm biên dịch cho các ràng buộc nhanh nhất có thể.

Vì Numpy được sử dụng rộng rãi, Cython hỗ trợ Numpy ra khỏi hộp. Nếu bạn đã cài đặt Numpy, bạn chỉ có thể trạng thái & nbsp;

Hồ sơ và hiệu suất của Cython

Bạn có được hiệu suất tốt nhất từ ​​bất kỳ đoạn mã nào bằng cách định lập nó và nhìn thấy tận mắt nơi các nút thắt. Cython cung cấp các móc cho mô -đun CPROFILE của Python, vì vậy bạn có thể sử dụng các công cụ định hình riêng của Python, như CPROFILE, để xem mã Cython của bạn hoạt động như thế nào. & NBSP;

Nó giúp ghi nhớ trong tất cả các trường hợp mà Cython không phải là ma thuật, đó là các hoạt động hiệu suất trong thế giới thực hợp lý vẫn được áp dụng.

Chẳng hạn, nếu bạn có một bộ sưu tập các đối tượng bạn muốn xử lý ở Cython, thì hãy lặp đi lặp lại nó trong Python và gọi một hàm Cython ở mỗi bước. Chuyển toàn bộ bộ sưu tập cho mô -đun Cython của bạn và lặp lại ở đó. Kỹ thuật này được sử dụng thường xuyên trong các thư viện quản lý dữ liệu, do đó, nó là một mô hình tốt để mô phỏng mã của riêng bạn.

Chúng tôi sử dụng Python vì nó cung cấp sự thuận tiện cho lập trình viên và cho phép phát triển nhanh. Đôi khi năng suất của lập trình viên có chi phí hiệu suất. Với Cython, chỉ cần thêm một chút nỗ lực có thể mang lại cho bạn những điều tốt nhất của cả hai thế giới.

Đọc thêm về Python

  • Python là gì? Lập trình mạnh mẽ, trực quan
  • Pypy là gì? Python nhanh hơn không đau
  • Cython là gì? Python với tốc độ của c
  • Hướng dẫn Cython: Cách tăng tốc Python
  • Cách cài đặt Python theo cách thông minh
  • Các tính năng mới tốt nhất trong Python 3.8
  • Quản lý dự án Python tốt hơn với thơ
  • VirtualEnv và Venv: Môi trường ảo Python được giải thích
  • Python Virtualenv và Venv Do, và don
  • Python ren và các quy trình con được giải thích
  • Cách sử dụng Trình gỡ lỗi Python
  • Cách sử dụng TimeIt để hồ sơ mã Python
  • Cách sử dụng CPROFILE để cấu hình mã Python
  • Bắt đầu với Async trong Python
  • Cách sử dụng Asyncio trong Python
  • Cách chuyển đổi Python thành JavaScript (và trở lại)
  • Python 2 EOL: Làm thế nào để sống sót sau khi kết thúc Python 2
  • 12 con trăn cho mọi nhu cầu lập trình
  • 24 Thư viện Python cho mỗi nhà phát triển Python
  • 7 ides python ngọt ngào bạn có thể đã bỏ lỡ
  • 3 Thiếu sót của Python chính và các giải pháp của họ
  • 13 khung web Python được so sánh
  • 4 Khung kiểm tra Python để nghiền nát lỗi của bạn
  • 6 tính năng python mới tuyệt vời mà bạn không muốn bỏ lỡ
  • 5 Phân phối Python để làm chủ việc học máy
  • 8 Thư viện Python tuyệt vời để xử lý ngôn ngữ tự nhiên

Serdar Yegulalp là một nhà văn cao cấp tại Infoworld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ.

Bản quyền © 2020 IDG Communications, Inc.

Python có cần trình biên dịch c không?

Python không cần trình biên dịch vì nó dựa vào ứng dụng (được gọi là trình thông dịch) biên dịch và chạy mã mà không lưu trữ mã máy được tạo dưới dạng mà bạn có thể dễ dàng truy cập hoặc phân phối. because it relies on an application (called an interpreter) that compiles and runs the code without storing the machine code being created in a form that you can easily access or distribute.

Python có gần C không?

Python là một ngôn ngữ lập trình mạnh mẽ hơn so với C vì nó có các chương trình quản lý bộ nhớ mạnh mẽ.Ngôn ngữ lập trình C chủ yếu được sử dụng để phát triển các ứng dụng phần cứng.Số lượng các chức năng tích hợp trong C rất hạn chế.Có rất nhiều chức năng tích hợp trong Python. as it has strong memory management schemes. The C programming language is mostly used for the development of hardware applications. The number of built-in functions in C are very limited. There are a lot of built-in functions in Python.