Hướng dẫn can cython convert python to c? - cython có thể chuyển đổi 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.

Khác xa với một chuyên gia C nhưng đối với tôi sử dụng Ubuntu, các tác phẩm sau:

main.c:

#include "foo_api.h"
#include 


int main(int argc, char *argv[]) {
     Py_Initialize();
     initfoo();
     import_foo();
     double arr[5] = {1,2,3,4,5};
     int i = 0;
     foo(arr);
     for(i = 0; i < 5; i++)
    {
      printf("%f\n", arr[i]);
    }
     Py_Finalize();
     return 0;
}

foo.pyx:

cdef public api  foo(double* x):
   x[0] = 0.0

Từ cùng một thư mục:

$ cython foo.pyx 

Then:

$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7   -o foo  *.c -lpython2.7 

Sau đó, chỉ cần chạy.

$ ./foo
0.000000
2.000000
3.000000
4.000000
5.000000

Tôi đã sử dụng

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
2 để lấy cờ:

 $ pkg-config --cflags python
-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 

Không gọi py_initialize (khởi tạo trình thông dịch python. Trong một ứng dụng nhúng python, điều này nên được gọi trước khi sử dụng bất kỳ chức năng API Python/C nào khác;), Bạn sẽ nhận được:

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

Không có

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
3 hoặc
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
4 bạn nhận được:

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

Nếu bạn không gọi py_finalize:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
5 A NO-OP khi được gọi lần thứ hai (mà không gọi py_finalize () trước tiên).

Để lấy ví dụ DeLorean từ các tài liệu để chạy:

main.py:

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

delorean.pyx:

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

Quy trình này là như nhau, thay đổi duy nhất là tôi phải sử dụng

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
6 với cấu trúc xe hoặc cách khác trong chính hoặc sử dụng tôi đã sử dụng
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
7 trong chính:

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

Bạn cũng có thể làm cho nó hoạt động mà không cần sử dụng

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
5, v.v.

Trong

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
9, bạn chỉ cần công khai chức năng:

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

Tôi đã thêm

python setup.py build_ext --inplace
0 vừa nhập
python setup.py build_ext --inplace
1in main.c và xóa
python setup.py build_ext --inplace
2, v.v ... Chỉ cần nhập
python setup.py build_ext --inplace
3 sẽ không hoạt động cho tôi nhưng đó có thể không phải là trường hợp của mọi người.

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

Biên dịch là như nhau:

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

Nếu bạn đang sử dụng phiên bản API thì chỉ cần bao gồm tiêu đề API hoặc ngược lại theo tài liệu, tuy nhiên, lưu ý rằng bạn nên bao gồm tên modulename.h hoặc modulename_api.h trong một tệp C đã cho, không phải cả hai định nghĩa.

Để làm tương tự với ví dụ DeLorean, tôi đã phải sử dụng

python setup.py build_ext --inplace
4 để in các chuỗi để tránh lỗi phân đoạn:

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

main:

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

Có thể có ý nghĩa hơn khi trả về các giá trị:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
0

main:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('The_Name_Of_Your_Pyx_Here.pyx'))
1

Chúng ta có thể chuyển đổi mã Python thành C không?

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 nói chuyện với nội bộ của Python và có thể được gói với mã Python hiện có.. Those C modules can be either generic C libraries or libraries built specifically to work with Python. Cython generates the second kind of module: C libraries that talk to Python's internals, and that can be bundled with existing Python code.

Cython có thể nhanh như C không?

Cython có cùng tốc độ như một chương trình C/C ++ được điều chỉnh cẩn thận; Điều chỉnh cẩn thận, Cython ánh xạ trực tiếp đến C/C ++. Tôi đã thực hiện nhiều điểm chuẩn của mã số cấp thấp khi triển khai Sagemath (sử dụng Cython cho một số dòng mã 100k).; carefully tuned, Cython maps directly to C/C++. I've done many benchmarks of low level numerical code when implementing SageMath (which uses Cython for several 100K lines of code).

Cython có thể biên dịch tất cả mã Python không?

Cython là một trình biên dịch tĩnh cho các ngôn ngữ lập trình Python và Cython, nó đơn giản hóa công việc viết các phần mở rộng Python C.Cython cho phép chúng tôi biên dịch mã Python, kết quả là các thư viện động cũng có thể được sử dụng làm mô -đun Python.Cython allows us to compile Python code, the result is dynamic libraries that can be used as python modules too.

Tôi có thể chuyển đổi mã Python thành C ++ không?

Chuyển đổi tập lệnh Python của bạn thành mã C ++ bằng Codex Openai.Đã tạo Codex_Py2Cpp như một cách thử nghiệm với Codex.Tệp Python tạo một dấu nhắc đầu vào sau đó được cung cấp cho Openai Codex để tạo mã C ++ tương ứng.. Created codex_py2cpp as a way of experimenting with Codex. Python file creates an input prompt which is then fed to OpenAI Codex to generate corresponding C++ code.