cython编译Python为c语言

第一种办法:

  • 执行命令:cython test.py
  • 结果:会在同一目录下面生成test.c文件
  • 执行命令: gcc -c -fPIC -I /usr/include/python2.7 test.c
  • 结果: 在同一目录下面生成test.o文件
  • 执行命令: gcc -shared test.o -c test.so
  • 结果: 在同一目录下面生成test.so文件

最后,生成的test.so文件就是需要的文件

第二种办法:

[setup.py]
from distutils.core import setup
    from Cython.Build import cythonize

    setup(
        name = "test",
        ext_modules = cythonize("test.py")
    )
  • 执行命令: python setup.py build_ext --inplace

第二种办法是对单独文件进行编译,下面介绍一种批量的办法:

#-*- coding:utf-8 -*-_
import os
import re
from distutils.core import Extension, setup

from Cython.Build import cythonize
from Cython.Compiler import Options

# __file__ 含有魔术变量的应当排除,Cython虽有个编译参数,但只能设置静态。
exclude_so = ['__init__.py', 'run.py']
sources = 'backend'

extensions = []
remove_files = []
for source,dirnames,files in os.walk(sources):
    for dirpath, foldernames, filenames in os.walk(source):
        if 'test' in dirpath:
            break;
        for filename in filter(lambda x: re.match(r'.*[.]py$', x), filenames):
            file_path = os.path.join(dirpath, filename)
            if filename not in exclude_so:
                extensions.append(
                        Extension(file_path[:-3].replace('/', '.'), [file_path], extra_compile_args = ["-Os", "-g0"],
                                  extra_link_args = ["-Wl,--strip-all"]))
                remove_files.append(file_path[:-3]+'.py')
                remove_files.append(file_path[:-3]+'.pyc')

Options.docstrings = False
compiler_directives = {'optimize.unpack_method_calls': False, 'always_allow_keywords': True}
setup(
        # cythonize的exclude全路径匹配,不灵活,不如在上一步排除。
        ext_modules = cythonize(extensions, exclude = None, nthreads = 20, quiet = True, build_dir = './build',
                                language_level = 2, compiler_directives = compiler_directives))

# 删除py和pyc文件
for remove_file in remove_files:

    if os.path.exists(remove_file):
        os.remove(remove_file)
  • 执行命令: python setup.py build_ext --inplace
  • 结果:最后生成.so文件,删除中间结果。

重点提一下,在编译flask代码时,遇到问题,报错:参数不够(大体意思是这样,错误未截图),在compiler_directives中添加: {always_allow_keywords:True}

原文地址:https://www.cnblogs.com/zhangjxblog/p/12168360.html

时间: 2024-10-09 07:47:05

cython编译Python为c语言的相关文章

<编译原理 - 函数绘图语言解释器(1)词法分析器 - python>

<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器:用于识别一条语句中的关键词是否符合预先定义的规则. 语法分析器:用来确定一条语句是否满足语法规则. 解释器:用来确定满足语法规则的句子,在意思上是否符合要求. 设计思路: 设计记号:词法分析器读取一个序列并根据构词规则把序列转化为记号流 定义一个字典:把所有符合一个模式的保留字.常量名.参数名.函数名等放进字

&lt;编译原理 - 函数绘图语言解释器(3)解释器 - python&gt;

<编译原理 - 函数绘图语言解释器(3)解释器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 将语法分析器并入绘图功能 继承语法分析器覆盖重写 用Pycharm写了一个.py文件: parserclass.py 输入流是语法分析器得到的语法树,输出流是绘制的图像 测试文本序列: //----------------测试程序1:分别测试------------------------ ORIGIN IS (100,300); //

用Cython编译写出更快的Python代码

原文地址: http://www.behnel.de/cython200910/talk.html以下为原文 About myself Passionate Python developer since 2002 after Basic, Logo, Pascal, Prolog, Scheme, Java, C, ... CS studies in Germany, Ireland, France PhD in distributed systems in 2007 Language desi

Python学习教程:用Cython加速Python代码,快到你想不到

如果你曾经用Python编写过代码,那么等待某些代码块执行的时间可能比您希望的要长.虽然有一些方法可以提高代码的效率,但它很可能仍然比C代码慢.这主要归结为一个事实:Python是一种动态编程语言,它将许多东西移动到C在编译期间负责的运行时. 不过,如果您像我一样喜欢用Python编写代码,并且仍然希望加快代码的速度,那么您可以考虑使用Cython.虽然Cython本身是一种独立的编程语言,但是很容易将其融入到您的工作流程中,例如Jupyter Notebook.在执行时,Cython将您的Py

Mac sublime 编译Python UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 6-8: ordinal not in range(128)

刚学Python,想打印个"hello 张林峰",代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- print('hello 张林峰') 用sublime运行一下,竟然报错??? Traceback (most recent call last): File "/Users/zhanglinfeng/Documents/Python/\u7ec3\u4e60/\u5b57\u7b26\u4e32\u7f16\u7801\

python与其他语言进行比较

最近python语言貌似比较火, 今天闲来无事,简单的看了下,算是个入门吧.一门语言之所以值得这么多人去学,必定有它的独到之处,下面我们就用python和其他语言做个比较. Pythond VS C# 1. Python跨平台,可以运行在linux.weindows等平台 2. Pythond开源,C#则相反 3. Python是解释型语言,C#需要编译,所以Python运行要慢点 Pythond VS Java Python更简洁,Java过于庞大复杂,语法很多 Python VS C C++

Python重写C语言程序100例--Part10

软中断 软中断的分配时静态的(即在编译时定义),而tasklet的分配和初始化可以在运行时进行. 软中断(即便是同一种类型的软中断)可以并发地运行在多个CPU上.因此,软中断是可重入函数而且必须明确地使用自旋锁保护其数据结构.tasklet不必担心这些问题,因为内核对tasklet的执行进行了更加严格的控制.相同类型的tasklet总是被串行执行. 换句话说就是:不能在两个CPU上同时运行相同类型的tasklet.但是,类型不同的tasklet可以在几个CPU上并发执行.tasklet的串行化使

使用Cython为Python写扩展1:初识Cython

使用Cython为Python写扩展1:初识Cython Cython使为Python写C扩展就如同写Python代码一样简单.广泛用于数学软件包,SAGE公司,作为执行快速,可扩展的运算.它提供了安全和可维护的方法通过自动生成所需代码来构建原生Python模块. 我们经常会使用Cython将C/C++实现的系统绑定到Python中,这样我们就可以使用Python来处理高级别逻辑,原生模块来处理底层代码. 关于示例 代码 http://git.oschina.net/erhuabushuo/le

python和C语言混编的几种方式

Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Python虽有GIL的问题导致多线程无法充分利用多核,但后来的multiprocess可以从多进程的角度来利用多核,甚至affinity可以绑定具体的CPU核,这个问题也算得到解决.虽基本为全栈语言,但有的时候为了效率,可能还是会去考虑和C语言混编.混编是计算机里一个不可回避的话题,涉及的东西很多,技术.架