Hướng dẫn can i compile python to c? - tôi có thể biên dịch python thành c không?

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

Hãy chắc chắn rằng bạn PIP cài đặt Cython trước.

Quá trình tổng thể đi như thế này.

  • Mang các phần mã của bạn mà bạn muốn chuyển đổi thành C thành một tệp riêng biệt
  • Cung cấp thông tin 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 tặng.
  • biên dịch tệp riêng biệt bằng tệp setup.py

Ví dụ này, hãy để nói rằng chúng tôi muốn biên dịch chức năng 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 điều này từ tệp .py vào tệp .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? Lưu nó trong tạp chí.

Ở Cython, có ba tuyên bố DEF

  • CDEF: Khai báo một cái gì đó sẽ được sử dụng trong C (như các biến bên trong hàm của chúng tôi)
  • PDEF: Tuyên bố một cái gì đó sẽ chỉ được sử dụng trong Python
  • CPDEF: Khai báo một cái gì đó 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 chức năng của chúng tôi trong Python, tôi đã sử dụng CDEF, nhưng đối với chính chức năng, 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 và hàm vì nó trả về int.

Bây giờ chúng ta phải biên dịch .pyx của chúng tôi. Trong một tệp riêng biệt (của tôi được đặt tên là setup.py), hãy viết 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 thiết bị đầu cuối (đảm bảo 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 nên đã biên dịch pyx của bạn và bạn sẽ thấy một tệp cùng tên với phần mở rộng .c thay vì pyx

Bây giờ bạn có thể nhập các chức năng C của mình vào các tệp Python cục bộ, cho rằng bạn đã sử dụng CPDEF, chỉ bằng cách nhập tên của tệp của bạn. IDE có xu hướng cho tôi lỗi nhập mặc dù họ nhập khẩu 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ó thực hiện giống như trong Python.

Điều này không biên dịch Python với mã máy. Nhưng cho phép tạo một thư viện được chia sẻ để gọi mã Python.

Nếu những gì bạn đang tìm kiếm là một cách dễ dàng để chạy mã Python từ C mà không cần dựa vào công cụ EXECP. Bạn có thể tạo một thư viện được chia sẻ từ mã Python được bọc bằng một vài cuộc gọi đến API nhúng Python. Vâng, ứng dụng là một thư viện được chia sẻ, một. Vì vậy mà bạn có thể sử dụng trong nhiều thư viện/ứng dụng khác.

Dưới đây là một ví dụ đơn giản tạo ra một thư viện chia sẻ, mà bạn có thể liên kết với chương trình C. Thư viện được chia sẻ thực thi mã Python.

Tệp Python sẽ được thực thi là

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
1:

# -*- encoding:utf-8 -*-
# this file must be named "pythoncalledfrom.py"

def main(string):  # args must a string
    print "python is called from c"
    print "string sent by «c» code is:"
    print string
    print "end of «c» code input"
    return 0xc0c4  # return something

Bạn có thể thử nó với

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
2. Nó sẽ xuất hiện:

python is called from c
string sent by «c» code is:
HELLO
end of «c» code input

Thư viện được chia sẻ sẽ được xác định theo sau bởi

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
3:

#ifndef CALL_PYTHON
#define CALL_PYTHON

void callpython_init(void);
int callpython(char ** arguments);
void callpython_finalize(void);

#endif

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
4 liên quan là:

// gcc `python2.7-config --ldflags` `python2.7-config --cflags` callpython.c -lpython2.7 -shared -fPIC -o callpython.so

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <python2.7/Python.h>

#include "callpython.h"

#define PYTHON_EXEC_STRING_LENGTH 52
#define PYTHON_EXEC_STRING "import pythoncalledfromc; pythoncalledfromc.main(\"%s\")"


void callpython_init(void) {
     Py_Initialize();
}

int callpython(char ** arguments) {
  int arguments_string_size = (int) strlen(*arguments);
  char * python_script_to_execute = malloc(arguments_string_size + PYTHON_EXEC_STRING_LENGTH);
  PyObject *__main__, *locals;
  PyObject * result = NULL;

  if (python_script_to_execute == NULL)
    return -1;

  __main__ = PyImport_AddModule("__main__");
  if (__main__ == NULL)
    return -1;

  locals = PyModule_GetDict(__main__);

  sprintf(python_script_to_execute, PYTHON_EXEC_STRING, *arguments);
  result = PyRun_String(python_script_to_execute, Py_file_input, locals, locals);
  if(result == NULL)
    return -1;
  return 0;
}

void callpython_finalize(void) {
  Py_Finalize();
}

Bạn có thể biên dịch nó với lệnh sau:

________số 8

Tạo một tệp có tên

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
5 chứa các mục sau:

#include "callpython.h"

int main(void) {
  char * example = "HELLO";
  callpython_init();
  callpython(&example);
  callpython_finalize();
  return 0;
}

Biên dịch nó và chạy:

cpdef int AddToTen():
cdef int x = 0
cdef int i
for i in range(1,11):
x+=i
return x
0

Đây là một ví dụ rất cơ bản. Nó có thể hoạt động, nhưng tùy thuộc vào thư viện, có thể vẫn khó để tuần tự hóa các cấu trúc dữ liệu C thành Python và từ Python đến C. Mọi thứ có thể được tự động hóa phần nào ...

Nuitka có thể hữu ích.

Ngoài ra có numba nhưng cả hai đều không nhằm mục đích làm những gì bạn muốn chính xác. Việc tạo tiêu đề C từ mã Python là có thể, nhưng chỉ khi bạn chỉ định cách chuyển đổi các loại Python thành các loại C hoặc có thể suy ra thông tin đó. Xem Python Astroid cho một máy phân tích Python AST.

Làm cách nào để chuyển đổi mã python thành c?

Chuyển đổi mã Python thành C cho tốc độ..
%% Cython -a def cy_fib (n): a = 0 b = 1 cho i trong phạm vi (n): a, b = a+b, a return a ..
%% Cython -a cpdef double cy_fib (int n): cdef double a, b a = 0 b = 1 cho i trong phạm vi (n): a, b = a+b, a return a ..
%timeit py_fib (100) %timeit numba_fib (100) %timeit cy_fib (100).

Có thể biên dịch Python với mã máy không?

Python không chuyển đổi mã của nó thành mã máy, thứ mà phần cứng có thể hiểu được.Nó thực sự chuyển đổi nó thành một thứ gọi là mã byte.Vì vậy, trong Python, việc biên dịch xảy ra, nhưng nó không phải là ngôn ngữ máy., something that hardware can understand. It actually converts it into something called byte code. So within python, compilation happens, but it's just not into a machine language.

Được biên dịch Python nhanh như C?

Tuy nhiên, Python đi kèm với 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 ++.It is much slower than compiled languages like C or C++.

Cython có chuyển đổi Python thành C không?

Những điều cơ bản của Cython Trình biên dịch Cython sẽ chuyển đổi nó thành mã C làm cho các cuộc gọi tương đương với API Python/C.Nhưng Cython còn nhiều hơn thế, bởi vì các tham số và biến có thể được khai báo là có các loại dữ liệu C.The Cython compiler will convert it into C code which makes equivalent calls to the Python/C API. But Cython is much more than that, because parameters and variables can be declared to have C data types.