不想直接暴露python 源代码,
cython
依赖
- cython
sudo pip install cython
- gcc
- python dev
通过源码编译安装的python 自带, 可以通过查找 Python.h 确认
验证
代码
from distutils.core import setup
from Cython.Build import cythonize
import sys
setup(ext_modules = cythonize('myos.py'))
# -*- coding: utf-8 -*-
import sys
import os
import commands
def module():
return __file__.rsplit('/', 1)[-1]
def hostname():
status, output = commands.getstatusoutput('hostname')
return output.strip() if status == 0 else None
def summ(k):
_sum = 0
if k < 0:
k = 0
for i in xrange(0, k):
_sum += i
return _sum
- my_main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import time
import myos
print 'my host:', myos.hostname()
print 'module:', myos.module()
s = time.time()
for i in xrange(0, 10000):
myos.summ(1000)
print 'summ: ', time.time() - s
编译
$python setup.py build
running build
running build_ext
building 'myos' extension
creating build
creating build/temp.linux-x86_64-2.7
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.7 -c myos.c -o build/temp.linux-x86_64-2.7/myos.o
creating build/lib.linux-x86_64-2.7
gcc -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-2.7/myos.o -L/usr/lib64 -lpython2.7 -o build/lib.linux-x86_64-2.7/myos.so
$find . -name "*.so"
./build/lib.linux-x86_64-2.7/myos.so
执行
直接使用myos.py, 运行结果
$python my_main.py
my host: zark-eu95-1.cz00b.stable.alipay.net
module: myos.py
summ: 0.334088087082
把myos.so cp 到 my_main.py 所在目录,删除myos.py myos.pyc
$python my_main.py
my host: zark-eu95-1.cz00b.stable.alipay.net
module: myos.so
summ: 0.238393068314
在cpu执行上,使用so 还是要比py快一点