⑴ python和cython是什麼關系
Python和c的混血Cython作為一個Python的編譯器,在科學計算方面很流行,用於提高Python的速度,通過OpenMPI庫還可以進行吧並行計算。
⑵ python安裝pyffmpeg,cython報錯:ImportError: No mole named Cython.Distutils
巧了,我今天也遇到了~
去搜下 visual c++ 2008 express edition ,安裝完之後就可以安裝cython了
⑶ python文件是以什麼為擴展名的文件
..py - 常規腳本
.py3 - Python3腳本(Python3腳本通常以.py而不是.py3結尾,很少使用)
.pyc - 編譯的腳本(位元組碼)
.pyo - 優化的pyc位元組碼文件(從Python3.5開始,Python將只使用pyc而不是pyo和pyc)
.pyw - 用pythonw.exe執行的Windows的Python腳本
.pyx - 將Cython src轉換為C/C++
.pyd - 作為Windows DLL創建的Python腳本
.pxd - 相當於C/C++頭文件的Cython腳本
.pyi - MyPy存根
.pyi - 存根文件(PEP 484)
.pyz - Python腳本歸檔(PEP 441)(這是一個包含標准Python腳本頭之後的二進制形式的壓縮Python腳本(ZIP)的腳本)
.pywz - 用於MS-Windows的Python腳本歸檔(PEP 441)(這是一個包含標准Python腳本頭之後的二進制形式的壓縮Python腳本(ZIP)的腳本)
⑷ 有沒有能把python代碼轉換為c語言代碼的工具
C++兼容C語言,但C語言不可能兼容C++
所以,C++代碼直接轉是轉不了C的。
只能從邏輯上,對C++的許多語法進行代碼上的重新實現。
比如將對象轉換為結構體,將對象封裝的函數修改為獨立函數,增加對象參數。
將重載去掉,而是根據需要調用非重載的不同名的函數。
總之來說,硬要將C++轉為C實現的話,那代碼重寫的工作是避免不了的。
⑸ python怎麼使用cython
1. Cython是什麼?
它是一個用來快速生成Python擴展模塊(extention mole)的工具
語法是Python和c的混血
Cython作為一個Python的編譯器,在科學計算方面很流行,用於提高Python的速度,通過OpenMPI庫還可以進行吧並行計算。
2. Cython安裝(Windows)
我的環境是win7 x64, python27, vs2010
安裝的基礎是有一個c編譯器(這里以vs2010為例)
從http://cython.org下載安裝包,解壓到一目錄,進入該目錄,在cmd命令行中執行
python setup.py install
註:執行過程可能遇到問題:Windows下pip安裝包報錯:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
解決方案:下載Microsoft Visual C++ Compiler for Python 2.7,點擊直接安裝即可。
3. 例子
例3.1:入門
創建hello.pyx,內容如下
def say_hello():
print "Hello World!"
創建setup.py,內容如下
from distutils.core import setup
from Cython.Build import cythonize
setup(name = 'Hello world app',
ext_moles = cythonize("hello.pyx"))
編譯Cython代碼
step1: 把.pyx文件被Cython便以為.c文件
step2: 把.c文件編譯為可導入的使用模塊.so(Windows下為.pyd)文件
1
2
python setup.py build
python setup.py install
註:可能出現問題:Unable to find vcvarsall.bat
原因:Python 2.7 會搜索 Visual Studio 2008.如果你電腦上沒有這個版本的話就會報錯。
如果裝的是vs2010,那麼在cmd命令行中執行
1
SET VS90COMNTOOLS=%VS100COMNTOOLS%
如果裝的是vs2010,那麼在cmd命令行中執行
1
SET VS90COMNTOOLS=%VS110COMNTOOLS%
執行
1
2
3
>>> import hello
>>> hello.say_hello()
Hello World!例3.2 通過靜態類型提高速度
在Cython中可以通過標記靜態類型來提高速度,凡是標記為靜態類型的部分都會將動態語言類型變為簡單的c代碼,從而提速。
但是如果濫用靜態類型,會降低可讀性,甚至因類型設置不當導致錯誤類型檢查造成速度降低。
例3.2.1 靜態類型變數
Python原生態代碼
compute.pyx
def f(x):
return x ** 2 - x
def integrate_f(a, b, N):
s = 0
dx = (b - a) / N
for i in range(N):
x += f(a + i * dx)
return s * dx
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_moles = cythonize("compute.pyx"),
)
test.py
import compute
import time
starttime = time.clock()
compute.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)
執行
1
2
3
python setup.py build
python setup.py install
python test.py
結果
1
read: 0.332332 s
使用靜態變數替換後的代碼
compute2.pyx
def f(double x):
return x ** 2 - x
def integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b - a) / N
for i in range(N):
s += f(a + i * dx)
return s * d
setup2.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Hello world app',
ext_moles = cythonize("compute2.pyx"),
)
test2.py
import compute2
import time
starttime = time.clock()
compute2.integrate_f(3.2, 6.9, 1000000)
endtime = time.clock()
print "read: %f s" %(endtime - starttime)
執行
1
2
3
python setup.py build
python setup.py install
python test.py
結果
1
read: 0.109200s
結論
該測試用例,使用靜態類型速度是不使用靜態類型的3倍。
例3.2.2 靜態類型函數
把compute2.pyx中的函數變為
cdef double f(double x):
return x ** 2 - x
def integrate_f(double a, double b, int N):
cdef int i
cdef double s, dx
s = 0
dx = (b - a) / N
for i in range(N):
s += f(a + i * dx)
return s * dx
結果
1
read: 0.084859 s
結論:比例子3.2.1速度又快了
例3.3 調用C函數
cdef extern from "math.h":
double sin(double)
double cos(double)
cpdef double Sin(double x):
return sin(x)
cpdef double Cos(double x):
return cos(x)
cpdef: 對於Python可使用的函數使用(為了使得在以後的Python程序中調用Sin,Cos函數,用cpdef,而不用cdef)
cdef: 對於C可使用的函數使用
請注意,上面的代碼聲明了 math.h 里的函數,提供給 Cython 使用。C編譯器在編譯時將會看到 math.h 的聲明,但 Cython 不會去分析 math.h 和單獨的定義。
⑹ 目前cpython調用C/C++的主流手段是cython么
還可以使用Cython來實現混編
1 下載Cython,用Python setup.py install進行安裝
2 一個實例
① 創建helloworld目錄創建helloworld.pyx,內容如下:cdef extern from"stdio.h": extern int printf(const char *format, ...) def SayHello(): printf("hello,world\n")
② 編譯,最方便的是利用python的Distutils了,
helloworld目錄下創建Setup.py,內容如下:from distutils.core import setupfrom distutils.extension import Extensionfrom Cython.Build import cythonize setup( name = 'helloworld', ext_moles=cythonize([ Extension("helloworld", ["helloworld.pyx"]), ]),) 編譯:python Setup.py build安裝:python Setup.py install安裝後,會將在build/lib.???目錄下生成的helloworld.pyd拷貝到Lib/site-packages註: 有時我們只是希望測試一下,並不希望安裝,這時可以把build/lib.???目錄下的helloworld.pyd拷貝到當前目錄 或者在importhelloworld前執行腳本:import sys;sys.path.append(pathof helloworld.pyd) ③ 測試:>>>import helloworld >>>helloworld.SayHello() hello,world
⑺ pypy如何把python的py文件編譯成c代碼
pypy是用python實現的python,區別於cPython,和C沒什麼關系,你要用python寫C,需要的是Cython。具體看文檔,沒那麼難。