首页 > 编程语言 >如何使用cpython

如何使用cpython

时间:2023-06-22 23:56:05浏览次数:32  
标签:pyx cpython python setup py 如何 64 使用 primes

这个的学习主要是因为在运行目标检测的代码时总是会出现下面的错误:

        from Cython.Build import cythonize
    ModuleNotFoundError: No module named 'Cython'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

安装:

pip install Cython
Collecting Cython
  Downloading Cython-0.29.19-cp37-cp37m-macosx_10_9_x86_64.whl (1.9 MB)

 

所以打算学学这个模块是怎么用的,以及用在哪里的

https://github.com/Sean16SYSU/CPython-Tutorial-zh

Python有时候太慢,如果手动编译C或者是C++来写#include<Python.h>的文件也比较麻烦。 CPython无疑是一个比较好的选择。

 

改进的理由

  1. 每一行的计算量很少,因此python解释器的开销就会变的很重要。
  2. 数据的局部性原理:很可能是,当使用C的时候,更多的数据可以塞进CPU的cache中,因为Python的元素都是Object,而每个Object都是通过字典实现的,cache对这个数据不很友好。

 

项目

Hello World项目

第一个项目是Hello world。

创建一个文件helloworld.pyx,内容如下:

print("Hello world!")

保存后,创建setup.py文件,内容如下:

复制代码
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("helloworld.pyx")
)
复制代码

保存后,命令行进入setup.py所在目录,并输入python setup.py build_ext --inplace,如下:

复制代码
$python setup.py build_ext --inplace
Compiling helloworld.pyx because it changed.
[1/1] Cythonizing helloworld.pyx
/anaconda3/envs/deeplearning/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /Users/user/pytorch/NLP学习/learning_2.0/helloworld.pyx
  tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'helloworld' extension
creating build
creating build/temp.macosx-10.9-x86_64-3.7
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/anaconda3/envs/deeplearning/include -arch x86_64 -I/anaconda3/envs/deeplearning/include -arch x86_64 -I/anaconda3/envs/deeplearning/include/python3.7m -c helloworld.c -o build/temp.macosx-10.9-x86_64-3.7/helloworld.o
gcc -bundle -undefined dynamic_lookup -L/anaconda3/envs/deeplearning/lib -arch x86_64 -L/anaconda3/envs/deeplearning/lib -arch x86_64 -arch x86_64 build/temp.macosx-10.9-x86_64-3.7/helloworld.o -o /Users/user/pytorch/NLP学习/learning_2.0/helloworld.cpython-37m-darwin.so
复制代码

运行完这个命令后,该目录下就会生成三个文件:

build                    helloworld.pyx
helloworld.c                setup.py
helloworld.cpython-37m-darwin.so

然后创建一个调用文件test.py,内容为:

import helloworld

运行返回:

i$ python test.py 
Hello world!

 

.pyx文件:

pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,“语法错误”。

 

上面的pyx文件还仅仅是源代码文件,要想被python调用、要想运行,仅仅写了源代码还是不够的(不像 Python 语言可直接解释使用的 .py 文件,.pyx 文件必须先被编译成 .c 文件,再编译成 .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用)。具体来说,还要转成.c或者.c++的文件,并且再进一步转成.pyd文件。pyd文件才是可以直接使用的文件。为了达到上述目的,就要写一个setup.py脚本,如上面那种

上述两个步骤,相当于把某个python效率瓶颈模块(这之前需要用profile工具来定位)用效率更高的代码写成了python的c扩展形式,接下来,就是要在python代码中调用他们。test.py就是这个调用的脚本

 

Fibonacci Function项目

斐波那契数列:1, 1, 2, 3, 5,... 前两位为1,之后每个数等于前面两个数之和。

创建fib.pyx,内容如下:

复制代码
from __future__ import print_function

def fib(n):
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()
复制代码

创建setup.py文件,内容如下:

复制代码
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("fib.pyx")
)
复制代码

通过命令python setup.py build_ext --inplace,生成出来的文件:

复制代码
python setup.py build_ext --inplace
Compiling fib.pyx because it changed.
[1/1] Cythonizing fib.pyx
/anaconda3/envs/deeplearning/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /Users/user/pytorch/NLP学习/learning_2.0/fib.pyx
  tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'fib' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/anaconda3/envs/deeplearning/include -arch x86_64 -I/anaconda3/envs/deeplearning/include -arch x86_64 -I/anaconda3/envs/deeplearning/include/python3.7m -c fib.c -o build/temp.macosx-10.9-x86_64-3.7/fib.o
gcc -bundle -undefined dynamic_lookup -L/anaconda3/envs/deeplearning/lib -arch x86_64 -L/anaconda3/envs/deeplearning/lib -arch x86_64 -arch x86_64 build/temp.macosx-10.9-x86_64-3.7/fib.o -o /Users/user/pytorch/NLP学习/learning_2.0/fib.cpython-37m-darwin.so
复制代码

测试test.py:

import fib
fib.fib(100)

返回:

$ python test.py 
1 1 2 3 5 8 13 21 34 55 89 

如果输出两者的时间:

复制代码
(deeplearning) userdeMacBook-Pro:learning_2.0 user$ python fib.pyx 
1 1 2 3 5 8 13 21 34 55 89 
5.7220458984375e-05
(deeplearning) userdeMacBook-Pro:learning_2.0 user$ python test.py 
1 1 2 3 5 8 13 21 34 55 89 
5.793571472167969e-05
复制代码

发现速度并没有很高的提升,很可能是操作本来就很简单,数值也很小,没什么优化的空间了。

 

Primes项目

给一个数值n,输出前n个质数(list)。

写到primes.pyx中:

复制代码
def primes(int nb_primes):
    cdef int n, i, len_p
    cdef int p[1000]
    if nb_primes > 1000:
        nb_primes = 1000

    len_p = 0
    n = 2
    while len_p < nb_primes:
        for i in p[:len_p]:
            if n % i == 0:
                break
        else:
            p[len_p] = n
            len_p += 1
        n += 1
    result_as_list = [prime for prime in p[:len_p]]
    return result_as_list
复制代码

setup.py:

复制代码
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("primes.pyx")
)
复制代码

test.py:

复制代码
import primes
import time

time0 = time.time()
primes.primes(10000)
print(time.time() - time0)
复制代码

返回使用时间:

0.0017080307006835938

 

prime.py原来:

复制代码
def primes(nb_primes):
    p = []
    if nb_primes > 1000:
        nb_primes = 1000

    n = 2
    while len(p) < nb_primes:
        for i in p:
            if n % i == 0:
                break
        else:
            p.append(n)
        n += 1
    result_as_list = [prime for prime in p]
    return result_as_list

if __name__ == '__main__':
    import time
    time0 = time.time()
    primes(10000)
    print(time.time() - time0)
复制代码

使用时间:

0.030839204788208008

可见的确快了不少!!!!!!

标签:pyx,cpython,python,setup,py,如何,64,使用,primes
From: https://www.cnblogs.com/wukai66/p/17498596.html

相关文章

  • c++ 64位输出地址超过int类型使用longlong类型输出
    #include<iostream>usingnamespacestd;intmain(){intarr[10]={1,2,3,4,5,6,7,8,9,20};cout<<"整个数组所占内存空间为"<<sizeof(arr)<<endl;cout<<"每个元素所占内存空间为"<<sizeof(arr[0])<<endl;cout<<"......
  • 霸道总裁式:不准使用Rust商标
    由拥有Rust和Cargo商标的Rust基金会起草的一项拟议新商标政策在更广泛的Rust社区中引起不满情绪,这要归功于限制,包括禁止自定义Rust工具或用Rust编写的软件使用Rust为名字,或在域名或子域的部分内容中使用名字Rust。4月7日,基金会发布了新政策草案,并通过谷歌表格征求意见,......
  • 前端怎么使用node-input-validator给接口添加参数校验(以strapi 4.9为例)
    node-input-validator是什么?简称NIV(NodeInputValidator)用于node.js的验证库使用它可以扩展库以添加自定义规则。npmNIV文档使用方法我们以strapi4.9版本项目为例,来试用一下它对我们接口的校验规则下载依赖npminode-input-validator在项目中创建全局中间件......
  • 使用pyinstaller打包python为exe文件
    将Python图形界面程序打包成可执行文件,可以在没有Python环境的电脑上运行,可以使用PyInstaller或者cx_Freeze等工具。使用PyInstaller打包Python程序首先,在命令行中安装PyInstaller:pipinstallpyinstaller在命令行中进入Python程序所在目录。输入以下命令:pyinstaller--onef......
  • 使用近10年,说说向大家推荐Linux系统的理由
    使用近10年,说说向大家推荐Linux系统的理由使用linux已经快十年了,一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。为什么现在我想推荐了呢?是因为我自认为相对于同龄人来说,我使用桌面版的时间算是挺长的了,而且我也......
  • 使用近10年,说说向大家推荐Linux系统的理由
    使用linux已经快十年了,一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。为什么现在我想推荐了呢?是因为我自认为相对于同龄人来说,我使用桌面版的时间算是挺长的了,而且我也想纠正一部分人不看好linux桌面版的这么......
  • 使用近10年,说说向大家推荐Linux系统的理由
    使用linux已经快十年了,一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。为什么现在我想推荐了呢?是因为我自认为相对于同龄人来说,我使用桌面版的时间算是挺长的了,而且我也想纠正一部分人不看好linux桌面版的这么......
  • 使用近10年,说说向大家推荐Linux系统的理由
    使用linux已经快十年了,一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。为什么现在我想推荐了呢?是因为我自认为相对于同龄人来说,我使用桌面版的时间算是挺长的了,而且我也想纠正一部分人不看好linux桌面版的这么......
  • 使用 python 插入 sql 字符串时将对象转换为元组插入占位符
    sql插入的值肯定是动态的,通过%s占位符插入变量:definsert_cover(data:pojos.Cover):sql="insertintocovers(temp,accel_x,accel_y,accel_z,cover_status,date,name,sno)values(%s,%s,%s,%s,%s,%s,%s,%s)"exeSql(sql,tuple(data))data是一个......
  • go 1.17 之后使用 go install 来安装 module
    楔子根据经验,我们知道goget可以用来安装module,module又分成2类,一类是普通的代码依赖,一类是可执行二进制工具。两类module分别会被放到不同的文件夹下,第一类代码依赖通常会被放在$GOPATH/pkg/mod文件夹下,第二类module通常被放在$GOPATH/bin路径下。今天按照教程使......