我就要选择和visual studio硬刚,这个东西实在是太流氓了。首先介绍一下参考:https://blog.csdn.net/xyisv/article/details/79389626

CPython是特指C语言实现的Python,就是原汁原味的Python。

之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。

当我们编写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的字节码。

先从Cpython的官方文档开始:

Cpython:http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html

这个cpython就很强大。最简单的helloworld在opencv-python四十五讲已经介绍过了,尽管但到目前为止,这个例子并没有真正让人感觉为什么会想要使用Cython,所以让我们创建一个更现实的例子。

pyximport:面向开发人员的Cython编译

如果您的模块不需要任何额外的C库或特殊的构建设置,那么您可以使用最初由Paul Prescod开发的pyximport模块在导入时直接加载.pyx文件,而无需在每次更改代码时运行文件setup.py。它随Cython一起发货和安装,可以像这样使用:

>>> import pyximport; pyximport.install()

>>> import helloworld

Hello World

该Pyximport模块还具有正常的Python模块实验编译支持。这允许您在Python导入的每个.pyx和.py模块上自动运行Cython,包括标准库和已安装的软件包。Cython仍然无法编译很多Python模块,在这种情况下,导入机制将回退到加载Python源模块。.py导入机制安装如下:

>>> pyximport.install(pyimport=True)

请注意,建议不要让Pyximport在最终用户端构建代码,因为它会挂钩到他们的导入系统。满足最终用户的最佳方式是提供轮式包装格式的预制二进制包 。

我们再看一个例子吧:

这样就不需要执行python setup.py build_ext --inplace了,也没有一些.c和build文件夹。

不过这样运行时间比较长。

Primes

Here’s a small example showing some of what can be done. It’s a routine for finding prime numbers. You tell it how many primes you want, and it returns them as a Python list.

下面是一个显示可以用Cpython做的事情。一般都是找素数。你告诉程序你需要多少素数,然后它返回一个python列表。

看到里面用了cdef。这个其实定义的就是c语言的类型。

You’ll see that it starts out just like a normal Python function definition, except that the parameter nb_primes is declared to be of type int . This means that the object passed will be converted to a C integer (or a TypeError. will be raised if it can’t be).

Lines 2 and 3 use the cdef statement to define some local C variables. The result is stored in the C array p during processing, and will be copied into a Python list at the end (line 22).

Note

You cannot create very large arrays in this manner, because they are allocated on the C function call stack, which is a rather precious and scarce resource. To request larger arrays, or even arrays with a length only known at runtime, you can learn how to make efficient use of C memory allocation, Python arrays or NumPy arrays with Cython.

注意:你不能用这种方式创建很大的数组,因为它们在函数的栈里面,栈是很珍贵和稀有的资源。为了申请大数组,甚至是运行时的可变长度数组,你可以学习如何高效地使用C语言的内存分配,python数组和Numpy数组。程序本身很简单,没什么需要解释的。

运行:

这种方式其实不需要写setup.py。这种方式也只有第一次比较慢。

如果修改primes.pyx,则

需要重新编译,速度就慢:

而且其实这种方式也生成了.c文件,只不过是在

去掉pyximport两句还是找不到这个模块的。其实真正有用的是pyd文件。它是机器码。

其实前面用pyximport也生成了这个pyd文件。

import pyximport

pyximport.install()

就有寻找pyd的功能。.c文件我觉得可能也是一个中间文件,是为了生成机器码的一个基础。

看到它是成功的。如果你比较好奇Cpython的工作是如何存储的,你可以看一看这个模块生成的C代码。这个上面看过了,有一些宏定义。

See, it works! And if you’re curious about how much work Cython has saved you, take a look at the C code generated for this module.

Cpython有一个可视化Python和Python的c API的方式。这个可以通过把cpythonize()的annotate设置为True。会产生一个HTML文件。

Cython has a way to visualise where interaction with Python objects and Python’s C-API is taking place. For this, pass the annotate=True parameter to cythonize(). It produces a HTML file. Let’s see:

如果全是白的,说明代码产生的时候没有和python交互,所以回和正常的C代码一样快。黄色越深,和Python交互的越多。那些黄色的行通常对python对象进行操作,引发异常,或者做各种高级操作,它们可以轻松地被编译为简单和快速的C代码。函数声明和返回使用Python解释器所以这些行都是黄色是有意义的(为了加快速度吧)。列表的解释也是一样的,因为它包含可一个python对象的生成。但是对于if n % i == 0呢?我们可以看看它生成的C代码。

If a line is white, it means that the code generated doesn’t interact with Python, so will run as fast as normal C code. The darker the yellow, the more Python interaction there is in that line. Those yellow lines will usually operate on Python objects, raise exceptions, or do other kinds of higher-level operations than what can easily be translated into simple and fast C code. The function declaration and return use the Python interpreter so it makes sense for those lines to be yellow. Same for the list comprehension because it involves the creation of a Python object. But the line if n % i == 0:, why? We can examine the generated C code to understand:

这是官网教程上的:

We can see that some checks happen. Because Cython defaults to the Python behavior, the language will perform division checks at runtime, just like Python does. You can deactivate those checks by using the compiler directives.我们可以看到有一些检查。因为Cython默认使用Python行为,所以语言将在运行时执行除法检查,就像Python一样。您可以使用编译器指令停用这些检查 。

点黄色的一行是可以看到生成的C代码的。

如果你用纯python来写这个:

primes_python的cpythonize版本是python版本的2倍快,两个版本的代码是一样的。Cpyython版本的速度是Python版本的13倍快。这个说明什么?Multiple things:

In this program, very little computation happen at each line. So the overhead of the python interpreter is very important. It would be very different if you were to do a lot computation at each line. Using NumPy for example.这个程序里面,每行的计算量都不大,所以python解释器的开销很重要。如果每一行做大量的计算,那么这个回很不一样。NumPy就是一个例子。

Data locality. It’s likely that a lot more can fit in CPU cache when using C than when using Python. Because everything in python is an object, and every object is implemented as a dictionary, this is not very cache friendly.数据位置。使用C的时候可以有更多的数据在CPU内存里。因为python里的所有东西都是对象,一个对象保存为一个字典形式,这个很消耗内存。

通常速度的提升在2倍到1000倍之间。这取决于你调用python解释器的次数。经常来说,在添加类型之前记得写一些注释。添加一些类型使你的代码可读性变差,所以适度地使用它们。

Usually the speedups are between 2x to 1000x. It depends on how much you call the Python interpreter. As always, remember to profile before adding types everywhere. Adding types makes your code less readable, so use them with moderation.

Primes with C++

使用cpython的话,可以发挥c++语言地优势,尤其是,C++的部分标准库直接从Cpython代码里面导入。来看使用C++标准库的向量会让我们的primes.pyx是个什么样子。

With Cython, it is also possible to take advantage of the C++ language, notably, part of the C++ standard library is directly importable from Cython code.

Let’s see what our primes.pyx becomes when using vector from the C++ standard library.

Note

c++种的向量是一种用列表或者栈里面存储的可变长度数组。它类似于Python的数组标准模块数组类型。有一种保存方法,可以防止复制如果你提前知道有多少元素将要放在向量里面。这个应该是说可以指定元素个数吧。

Vector in C++ is a data structure which implements a list or stack based on a resizeable C array. It is similar to the Python array type in the array standard library module. There is a methodreserve available which will avoid copies if you know in advance how many elements you are going to put in the vector. For more details see this page from cppreference.

第一行是编译的指引。它告诉cpython去把你的代码编译为c++。这使得可以使用C++语言的特性和c++的标准库。注意使用pyximport把Cpython代码编译为C++时不可能的。你应该使用一个setup.py或者一个笔记本来运行这个例子。

The first line is a compiler directive. It tells Cython to compile your code to C++. This will enable the use of C++ language features and the C++ standard library. Note that it isn’t possible to compile Cython code to C++ with pyximport. You should use a setup.py or a notebook to run this example.

你可以看到向量的API和Python列表的API很像,并且可以用做Cpython中随机访问的代替品。

You can see that the API of a vector is similar to the API of a Python list, and can sometimes be used as a drop-in replacement in Cython.

编译结束后:

很好。

python和c学习-Cpython学习一:入门相关推荐

  1. 如何零基础学习python语言_零基础如何入门Python语言?有哪些学习建议?

    众所周知,Python目前是最受欢迎的编程语言之一,尤其是对于零基础的初学者来说,Python语言更是十分的友好.因此,不少初学者常常会有这样一个共同的疑惑,零基础如何入门Python语言?本文就来给 ...

  2. 零基础学python语言_零基础如何入门Python语言?有哪些学习建议?

    众所周知,Python目前是最受欢迎的编程语言之一,尤其是对于零基础的初学者来说,Python语言更是十分的友好.因此,不少初学者常常会有这样一个共同的疑惑,零基础如何入门Python语言?本文就来给 ...

  3. python爬虫自学路线_python 爬虫学习路线:从入门到进阶

    大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...

  4. python 需要多久能够学精通_python入门到精通需要学多久-史上最详细python学习路线-从入门到精通,只需5个月时间...

    针对Python的初学者,从无到有的Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行Python ...

  5. python入门教材论坛_GitHub - aisuhua/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...

    PythonShare Python初学者(零基础学习Python.Python入门)书籍.视频.资料.社区推荐 本文 主要 针对 零基础 想学习Python者.本文本文由@史江歌(shijiangg ...

  6. 专业放心的python入门视频_手把手教你掌握学习Python方法,让你不再从入门到放弃...

    随着数据科学概念的普及,Python 这门并不算新的语言火得一塌糊涂.因为写了几篇用 Python 做数据分析的 文章,经常有读者和学生私信问我,想学习 Python,该如何入手?我经常需要根据学习, ...

  7. python gui编程书籍_GitHub - ZhaoGui/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...

    PythonShare Python初学者(零基础学习Python.Python入门)书籍.视频.资料.社区推荐 本文 主要 针对 零基础 想学习Python者.本文本文由@史江歌(shijiangg ...

  8. python入门指南推文_GitHub - Hiufan/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...

    PythonShare Python初学者(零基础学习Python.Python入门)书籍.视频.资料.社区推荐 本文 主要 针对 零基础 想学习Python者.本文本文由@史江歌(shijiangg ...

  9. Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐

    转载自:https://github.com/Yixiaohan/codeparkshare Python初学者(零基础学习Python.Python入门)书籍.视频.资料.社区推荐 本文 主要 针对 ...

最新文章

  1. c语言模拟考试题目,10道C语言笔试模拟题
  2. 【Python基础】用Python制作漂亮的流动桑基图
  3. Centos Flex 2.6.4
  4. 一篇文学会商用可编辑问卷表单制作【iVX 十二】
  5. 悲情天才沃尔特·皮兹
  6. 课程 2B: 制作一款交互性应用
  7. C# WPD PortableDeviceApiLib获取便携设备列表
  8. spring缓存与Redis
  9. 5G大数据技术防控新型肺炎疫情
  10. vsftpd配置详解
  11. MT7621芯片技术资料分析,MT7621数据表原理图
  12. C++_008_数据结构_线性表_普通线性表
  13. 谷歌ai人工智能叫什么_谷歌正在通过AI策展和内置订阅全面革新Google新闻
  14. linux切换桌面的快捷键,SUSE Linux Gnome桌面快捷键整理
  15. 不定积分、定积分 复习笔记
  16. 使用 Ghidra 分析 phpStudy 后门
  17. ef连接mysql报root没有权限_EF下使用自定义的connectionString避免数据库密码泄露
  18. 免费cocos2dx3.x视频教程
  19. Flash从入门到实践系列(一):环境安装
  20. PyQt5_寻找波峰波谷并可视化

热门文章

  1. PHP rss聚合,利用PHP和AJAX创建RSS聚合器
  2. dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes-阿里云开发者社区
  3. 开发日记-20190525 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  4. 开发日记-20190522 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  5. Canvas之translate,scale,rotate,skew
  6. ES cross cluster search跨集群查询
  7. 条件随机场——时间序列(句子单词序列也算),其特征函数必须要考虑前一刻的数据...
  8. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
  9. angularjs 中的scope继承关系——(2)
  10. 最大公共子序列、子串、可重叠重复子串