-
2020-11-29 09:40:29
CPython是特指C语言实现的Python,就是原汁原味的Python。
之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。
如下是官方对CPython的说明:
CPython is Guido van Rossum’s reference version of the Python computing language. It’s most often called simply “Python”; speakers say “CPython” generally to distinguish it explicitly from other implementations.
这个页面对Python各种不同的实现有一个说明:
https://wiki.python.org/moin/PythonImplementations?action=show&redirect=implementation
当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。
由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
CPython
当我们从Python官方网站下载并安装好Python 3.5后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。
PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。
Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
---------------------
作者:Reacubeth
来源:CSDN
原文:https://blog.csdn.net/xyisv/article/details/79389626
版权声明:本文为博主原创文章,转载请附上博文链接!
更多相关内容 -
faster-cpython:如何使CPython更快
2021-03-17 00:20:16更快的CPython快五倍我们希望在接下来的四个发行版中将CPython的速度提高5倍。 请参阅以了解如何完成此操作。付钱要使CPython快这个数量,将需要资金。 依靠核心开发人员的商誉和业余时间是不够的。 请参阅,以了解... -
_bz2.cpython-37m-x86_64-linux-gnu.so
2019-10-10 15:41:35下载编译好的含有bz2的so文件 将_bz2.cpython-37m-x86_64-linux-gnu.so放到对应的python3.7文件夹里…/python3.7/lib-dynload/下 测试: python3 import bz2 -
_bz2.cpython-38-x86_64-linux-gnu.so
2020-03-04 20:45:37发生以下错误: 从_bz2导入BZ2Compressor,BZ2Decompressor ImportError:没有名为“ _bz2”的模块 复制到/lib/python3.8/lib-dynload -
CPythonInternals:这是一个存储库,其中包含CPython解释器的代码示例。 从Real Python上名为“ CPython ...
2021-03-15 07:26:44CPython内部 这是一个存储库,其中包含CPython解释器的代码示例。 从一本名为“ CPython Internals”的Real Python书籍中学习。 -
cpython-3.10.2-1.5.7-API文档-中英对照版.zip
2022-07-03 22:18:52赠送jar包:cpython-3.10.2-1.5.7.jar; 赠送原API文档:cpython-3.10.2-1.5.7-javadoc.jar; 赠送源代码:cpython-3.10.2-1.5.7-sources.jar; 赠送Maven依赖信息文件:cpython-3.10.2-1.5.7.pom; 包含翻译后的API... -
_bz2.cpython-36m-x86_64-linux-gnu.so
2017-10-30 13:50:56Python3.6的bz2模块需要的so文件,可复制到lib/python3.6/lib-dynload使用 -
CPython教程
2019-06-20 20:53:48CPython-Tutorial-zh 中文CPython教程 简述 Python有时候太慢,如果手动编译C或者是C++来写#include<Python.h>的文件也比较麻烦。 CPython无疑是一个比较好的选择。 这篇教程是基于 ......CPython-Tutorial-zh
简述
Python有时候太慢,如果手动编译C或者是C++来写
#include<Python.h>
的文件也比较麻烦。
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的
- 每一行的计算量很少,因此python解释器的开销就会变的很重要。
- 数据的局部性原理:很可能是,当使用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项目
斐波那契数列: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
,生成出来的文件: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.4142135623730951
- https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html
-
CPython学习
2022-04-07 14:40:25之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。 如下是官方对CPython的说明: CPython is Guido van前言
Python有时候太慢,如果手动编译C或者是C++来写#include<Python.h>的文件也比较麻烦。
CPython无疑是一个比较好的选择。
简介
CPython是特指C语言实现的Python,就是原汁原味的Python。
之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。
如下是官方对CPython的说明:
CPython is Guido van Rossum’s reference version of the Python computing language. It’s most often called simply “Python”; speakers say “CPython” generally to distinguish it explicitly from other implementations.
案例
先从一个Hello Word开始
-
创建一个文件helloworld.pyx,内容如下:
print("Hello world!") #pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。
-
保存后,创建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!
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
-
-
安装CPython解释器
2021-09-07 07:55:43大家常说的Python是一门编程语言,程序员学习编程语言的语法写出来的代码 需要由解释器来运行,而Python主流的解释器就是CPython。所以大家的电脑上需要先安装上CPython解释器,然后才能运行自己编写的Python代码。 ...大家常说的Python是一门编程语言,程序员学习编程语言的语法写出来的代码 需要由解释器来运行,而Python主流的解释器就是CPython。所以大家的电脑上需要先安装上CPython解释器,然后才能运行自己编写的Python代码。
打开官网:http://www.python.org,点击Downloads下载,如下图
下拉页面,选择对应版本:Python3.6.3,如下图
向下查找,找到Python 3.6.3 根据系统选择对应的安装包,如下图
根据当前系统的选择对用的,红色的是windows32位系统,绿色的是windows64系统位,目前大家的基本都是64位系统,所以一般选择 绿色框 标记的 x86-64 安装包。
下载完成,如下图
下载完成后找到下载的目录,然后用鼠标左键双击
安装
执行下一步
勾选安装
安装成功
-
python附加篇cpython用法
2020-08-31 22:53:04心得:刚换工作后,连续忙了2个多月,在这两个多月...先从cpython开始吧,cpython用作代码保护或者能够提升代码运行的效率。 一、Cpython简介 二、快速开始,配置文件以及编译 三、cpython中编码注意事项 四、其他 ... -
Cpython源码分析01_使用Visual Studio2017来研究Cpython,debug和release两种模式下编译的Python中__sizeof...
2021-08-03 23:15:07目前python主流的解释器CPython、JPython、IPython、PyPy、IronPython,但是用到最多的、生态最好的还是Cpython。 了解python底存的构造,比如List、Dict、Set、Tuple等他们到底是怎么实现的,而不是用它的时候两眼... -
CPython与Cython
2019-11-22 13:23:33CPython是解释器 当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。 这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。 ... -
python、cpython、IPython、Jython区别
2020-12-06 14:58:59Python是解释型语言,代码在执行时会一行一行地...当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行pyt -
ubuntu18.04安装Cpython
2021-01-21 21:19:06Cpython的安装,理论上是很简单的:pip3 install Cpython 即可安装成功,但安装pip3 install sklearn时出现: ModuleNotFoundError: Please install Cython with a version >= 0.28.5 in order to build a scikit... -
Cpython pyc文件
2019-05-05 14:50:00CPython是特指C语言实现的Python,就是原汁原味的Python。 之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。 如下是... -
ImportError: No module named 'cpython'
2019-12-27 21:05:55解决方法,在终端执行指令,等待下载即可 sudo pip install cpython -
Pycharm中Python Console版本切换Ipython和CPython
2019-09-20 10:30:28比如下图中我的Console当前使用的版本是Python3.6.8的Cpython。 但是有的项目打开可能就不是这么简单常见的解释器版本,而是下图这样超级无敌罗里吧嗦 的 当然,你的Pycharm底部菜单没有Pytho... -
Cython与CPython的区别
2019-08-10 09:51:45Cython是一种混编的语言,可以让python调用C++容器,例如vector CPython是一种被广泛使用的python解释器,类似的解释器还有pypy,JPython等等 -
cpython编译
2017-07-23 15:40:51https://github.com/python/cpython中间需要编译binutils-2.28 /configure –prefix=/opt/binutils –host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc Make -j4 Makecpython ./configure –prefix=/opt/... -
cpython-36m-x86_64-linux-gnu.so undefined symbol玄学解决
2021-09-14 17:29:13cpython-36m-x86_64-linux-gnu.so undefined symbol玄学解决 xshell上使用python import一个机器学习的动态库,一直直接使用都正常,自从改了bashrc以添加一个新的模块以后,再import老是报错,出现一大堆undefined ... -
Cpython和Jython的对比
2018-08-02 19:09:14CPython 当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。 CPython是... -
CPython是什么?PyPy是什么?Python和这两个东西有什么关系
2019-06-04 16:25:02其中使用c语言开发的叫做python,在于别的语言开发的python对比时为避免歧义通常称为CPython。 同样的,使用java开发的叫做JPython,使用.net开发的叫做IronPython。 而PyPy与CPython的不同在于,别的一些python... -
/mmcv/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol
2021-07-13 13:10:15跑mmdetection的Demo,碰见这个错误: ImportError: XX/python3.7/site-packages/mmcv/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZTIN3c1021AutogradMetaInterfaceE 参考github issue: ... -
错误解决:site-packages/mmcv/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN2at5sliceERK
2022-04-26 11:19:21我运行MMdetection时报的错,检查发现torch python cuda版本都对应版本检查,发现mmcv版本错误,我的mmcv 版本时1.4.3,最后根据cuda和torch版本重装 解决方法: pip uninstall mmcv-full ... ... -
python安装torchvision报错“ImportError: /opt/.../torchvision/_C.cpython-36m-x86_64-linux-gnu.so”
2022-03-09 11:29:29主要原因是torchvision的版本与pytorch版本不兼容,选择和pytorch版本兼容的torchvision版本即可。 一、查看pytorch的版本:在python IDE中输入, import torch print(torch.__version__) ... -
CPython、IPython、PyPy、Jython、IronPython名词解释
2019-01-25 09:54:53当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。 由于整个Python语言从规范...CPython 当我们从Python官方网站下载并安装好...... -
_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe26deta
2021-09-04 22:05:21之前mmdetection可以很好的使用,突然出现种错误,找了好久,更新了mmcv-full的版本,才解决! -
_C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN2at19UndefinedTensorImpl10_singletonE
2021-04-17 20:31:59ERROR: ..._C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN2at19UndefinedTensorImpl10_singletonE 解决: https://github.com/Tramac/awesome-semantic-segmentation-pytorch/issues/24 ...