CPython教程

CPython教程CPython Tutorial zh 中文 CPython 教程简述 Python 有时候太慢 如果手动编译 C 或者是 C 来写 include Python h 的文件也比较麻烦 CPython 无疑是一个比较好的选择 这篇教程是基于 https cython readthedocs io en latest src tutorial cython tutorial html Python h

CPython-Tutorial-zh

中文CPython教程

简述

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

这篇教程是基于

  • https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html
    同时也参考了 http://docs.cython.org/en/latest/

  • 但我会在这个的基础上做一些补充。
    同样,这个项目,我会持续更新到github上

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

改进的理由

来源于link1的

  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,如下:

PS D:\Code\CPython\Test> python setup.py build_ext --inplace Compiling helloworld.pyx because it changed. [1/1] Cythonizing helloworld.pyx running build_ext building 'helloworld' extension creating build creating build\temp.win-amd64-3.6 creating build\temp.win-amd64-3.6\Release C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\lijy2\AppData\Local\Programs\Python\Python36\include -IC:\Users\lijy2\AppData\Local\Programs\Python\Python36\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\cppwinrt" /Tchelloworld.c /Fobuild\temp.win-amd64-3.6\Release\helloworld.obj helloworld.c C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\lijy2\AppData\Local\Programs\Python\Python36\libs /LIBPATH:C:\Users\lijy2\AppData\Local\Programs\Python\Python36\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.16299.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.16299.0\um\x64" /EXPORT:PyInit_helloworld build\temp.win-amd64-3.6\Release\helloworld.obj /OUT:D:\Code\CPython\Test\helloworld.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\helloworld.cp36-win_amd64.lib 正在创建库 build\temp.win-amd64-3.6\Release\helloworld.cp36-win_amd64.lib 和对象 build\temp.win-amd64-3.6\Release\helloworld.cp36-win_amd64.exp 正在生成代码 已完成代码的生成 

在该目录下的命令行进入Python操作界面,导入包之后,就会自动输出Hello world!,如下:

PS D:\Code\CPython\Test> python Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import helloworld Hello world! 

这就完成了一个简单的CPython的扩展书写。下面再举例子。

Fibonacci Function项目

创建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,生成出来的文件:

import fib fib.fib(100) 

输出:

1 1 2 3 5 8 13 21 34 55 89 
  • 但是经过测试之后,发现速度并没有很高的提升,很可能是操作本来就很简单,数值也很小,没什么优化的空间了。

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") ) 

在参考的link中给出了测试的案例,有些解释的不太好,我这边描述一下

  • 直接使用Python实现版本,平均用时23ms
  • Python版本用CPython编译(对,直接把Python文件名字像pyx一样放进去就好了), 平均用时11ms
  • pyx的CPython编译版本,平均用时1.6ms

Stat项目

注意,这里不能直接使用stat,因为似乎是有这个库了emmmm

stat_.pyx:

from libc.math cimport sqrt def mean(list arr): cdef: int i int sz double tmp tmp = 0 sz = len(arr) for i in range(sz): tmp += arr[i] return tmp / sz def std(list arr): cdef: double m = mean(arr) int sz, i double tmp sz = len(arr) tmp = 0 for i in range(sz): tmp += (arr[i] - m)  2 return sqrt(tmp) 

setup.py:

from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("stat_.pyx") ) 

命令还是一样的:python setup.py build_ext --inplace

测试:

>>> import stat_ >>> a = [1,2,3] >>> stat_.mean(a) 2.0 >>> stat_.std(a) 1.30951 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201550.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:08
下一篇 2026年3月20日 上午9:09


相关推荐

  • docker 中国站 www.dockerpool.com 报价图片下载

    docker 中国站 www.dockerpool.com 报价图片下载

    2022年1月17日
    37
  • Java面试题

    Java面试题Java面试题

    2022年4月23日
    44
  • ubuntu配置opencv环境_opencv的安装与配置详细教程

    ubuntu配置opencv环境_opencv的安装与配置详细教程目录一、安装opencv(1)下载opencv-3.4.15数据包(2)解压缩包(3)使用cmake安装opencv​​(4)配置环境(5)检验二、实例使用(1)打开图片(2)打开摄像头显示处理视频(3)录制视频三、总结四、参考文献一、安装opencv(1)下载opencv-3.4.15数据包打开浏览器,进入下载地址ReleaseOpenCV3.4.15·opencv/opencv·GitHub,选择Source..

    2026年4月16日
    4
  • 前端网页设计必逛的六个宝藏网站(非常值得收藏)

    前端网页设计必逛的六个宝藏网站(非常值得收藏)本网站包含图标库 矢量插画库 3D 插画库以及 Lottie 库 内容丰富且精美 只有你想不到的 没有你找不到的 拿这些精美图标来设计网页页面 一定会惊艳别人 美叶

    2026年3月18日
    1
  • macbookpro双系统分区_macbook双系统分区调整

    macbookpro双系统分区_macbook双系统分区调整一些前序知识:1、Mac系统不是Intel的i386架构,没有Bios,但是有EFI,通过EFI管理系统的引导。2、Mac系统的分区表采用GUID,不是MBR。因此如果硬盘完全交给windows控制,会导致Mac系统无法启动。3、任何对MBR的强行操作,会导致已经装好的双系统引导失效。4、Mac的EFI分区会用GPT锁定,不要尝试去操作这个分区。我们…

    2022年10月5日
    5
  • Java反射技术详解

    Java反射技术详解前言相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习发射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术、Hook技术等必不可…

    2022年4月29日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号