cpython

Python并发编程理论篇

自作多情 提交于 2020-08-09 16:56:33
Python并发编程理论篇 前言    其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住一个点: 并发编程永远的宗旨就是提高程序的运行效率,也是围绕CPU来进行优化的一种技术手段。    像我们之前学习过的网络编程中,我们只是基于 socketserver 模块让我们的Server端有了处理多任务的能力,但是我们并不了解它的底层是怎么做到的,在学习完并发编程后,尝试自己阅读一下 socketserver 源码,你将会大有收获。    并发编程很重要吗?是的,非常重要,如果你想进入 PythonWeb 领域那么著名的框架如 Django , Tornado , Flask 等等底层都是有基于本章节的知识点,如果你想进入爬虫领域那就更不用说了,非常强大的 scrapy 框架也是基于我们所学的这些东西累积起来的。    好了废话不多说,让我们开始进入并发编程的学习吧。 从任务处理角度看待操作系统发展史    这一节主要是理论知识,了解计算机任务处理方式的演变过程,能够让我们更快的理解和学习并发编程。    首先,我们先来回顾一下操作系统方面的一些知识。    操作系统的作用:管理硬件,目的就是让用户更加方便的来操控计算机底层的硬件。   

使用 ZeroMQ 消息库在 C 和 Python 间共享数据

你说的曾经没有我的故事 提交于 2020-08-09 12:17:25
ZeroMQ 是一个快速灵活的消息库,用于数据收集和不同编程语言间的数据共享。 作为软件工程师,我有多次在要求完成指定任务时感到浑身一冷的经历。其中有一次,我必须在一些新的硬件基础设施和云基础设施之间写一个接口,这些硬件需要 C 语言,而云基础设施主要是用 Python。 实现的方式之一是 用 C 写扩展模块 ,Python 支持 C 扩展的调用。快速浏览文档后发现,这需要编写大量的 C 代码。这样做的话,在有些情况下效果还不错,但不是我喜欢的方式。另一种方式就是将两个任务放在不同的进程中,并使用 ZeroMQ 消息库 在两者之间交换消息。 在发现 ZeroMQ 之前,遇到这种类型的情况时,我选择了编写扩展的方式。这种方式不算太差,但非常费时费力。如今,为了避免那些问题,我将一个系统细分为独立的进程,通过 通信套接字 发送消息来交换信息。这样,不同的编程语言可以共存,每个进程也变简单了,同时也容易调试。 ZeroMQ 提供了一个更简单的过程: 编写一小段 C 代码,从硬件读取数据,然后把发现的东西作为消息发送出去。 使用 Python 编写接口,实现新旧基础设施之间的对接。 Pieter Hintjens 是 ZeroMQ 项目发起者之一,他是个拥有 有趣视角和作品 的非凡人物。 准备 本教程中,需要: 一个 C 编译器(例如 GCC 或 Clang ) libzmq 库

爬虫(107)Python 3.7的超酷新功能(接近一万字,请耐心享用,而且建议收藏)...

若如初见. 提交于 2020-08-09 01:56:14
Python 3.7 正式发布 ! 这个新的Python版本自 2016 年 9月 开始开发 ,现在我们所有人都可以享受核心开发人员辛勤工作的成果。 新的Python版本带来了什么? 尽管 文档 很好地概述了这些新功能,但本文将深入探讨一些重大新闻。 这些包括: 通过新的 breakpoint() 内置功能 更轻松地访问调试器 使用数据类创建简单的类 定制访问模块属性 改进了对类型提示的支持 高精度计时功能 更重要的是,Python 3.7速度很快 在本文的最后几节中,您将了解有关此速度的更多信息,以及Python 3.7的其他一些出色功能。 您还将获得有关升级到新版本的一些建议 内置的 breakpoint() 断点函数 虽然我们可能会努力编写完美的代码,但简单的事实是我们从不这样做。 调试是编程的重要组成部分。 Python 3.7引入了新的内置函数 breakpoint() 。 这实际上并没有向Python添加任何新功能,但是它使调试器的使用更加灵活和直观。 假设文件中包含以下错误代码 bugs.py : def divide(e, f): return f / e a, b = 0, 1 print(divide(a, b)) 运行代码会导致 函数 ZeroDivisionError 内部 divide() 。 假设您要中断代码并 直接在的顶部 放入 调试器 divide(

Difference between Python 3.7 math.remainder and %(modulo operator)

送分小仙女□ 提交于 2020-08-07 05:02:16
问题 From What’s New In Python 3.7 we can see that there is new math.remainder. It says Return the IEEE 754-style remainder of x with respect to y. For finite x and finite nonzero y, this is the difference x - n*y , where n is the closest integer to the exact value of the quotient x / y . If x / y is exactly halfway between two consecutive integers, the nearest even integer is used for n . The remainder r = remainder(x, y) thus always satisfies abs(r) <= 0.5 * abs(y) . Special cases follow IEEE

Difference between Python 3.7 math.remainder and %(modulo operator)

半腔热情 提交于 2020-08-07 05:00:46
问题 From What’s New In Python 3.7 we can see that there is new math.remainder. It says Return the IEEE 754-style remainder of x with respect to y. For finite x and finite nonzero y, this is the difference x - n*y , where n is the closest integer to the exact value of the quotient x / y . If x / y is exactly halfway between two consecutive integers, the nearest even integer is used for n . The remainder r = remainder(x, y) thus always satisfies abs(r) <= 0.5 * abs(y) . Special cases follow IEEE

Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

蓝咒 提交于 2020-08-06 15:13:53
从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> x, y = 1, 2 >>> print(x, y) # 结果:1 2 在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“=”号左侧的两个变量。 如果我们直接写 x = 1,2 ,然后打印出 x,或者在“=”号右侧写成一个元组,就能证实到这一点: >>> x = 1, 2 >>> print(x) # 结果:(1, 2) >>> x, y = (1, 2) >>> print(x, y) # 结果:1 2 一些博客或公众号文章在介绍到这个特性时,通常会顺着举一个例子,即基于两个变量,直接交换它们的值: >>> x, y = 1, 2 >>> x, y = y, x >>> print(x, y) # 结果:2 1 一般而言,交换两个变量的操作需要引入第三个变量。道理很简单,如果要交换两个杯子中所装的水,自然会需要第三个容器作为中转。 然而,Python 的写法并不需要借助中间变量,它的形式就跟前面的解包赋值一样。正因为这个形式相似,很多人就误以为 Python 的变量交换操作也是基于解包操作。 但是,事实是否如此呢? 我搜索了一番

蟒周刊-423-Python 依赖关系管理工具概述

Deadly 提交于 2020-08-06 08:28:53
原文: PyCoder's Weekly - Issue #423 200527 Zoom.Quiet (大妈) 用时 42 分钟 完成快译 200527 Zoom.Quiet (大妈) 用时 37 分钟 完成格式转抄. 从终端向 Python 传递代码的多种方法 BRETT CANNON You might know about pointing Python to a file path, or using -m to execute a module. But did you know that Python can execute a directory? Or a .zip file? ( 是也乎: 甚至于还有通过 FaaS 直接远程嗯哼的... ) Python 3.9 的 PEP 们 JAKE EDGE The first Python 3.9 beta release is upon us! Learn what to expect in the final October release by taking a tour of the Python Enhancement Proposals (PEPs) that were accepted for Python 3.9. ( 是也乎: 老爹离开后, Py 没了缰绳儿, 越来越欢跳了... ) Python

Python一键转Jar包,Java调用Python新姿势!

◇◆丶佛笑我妖孽 提交于 2020-08-06 07:57:31
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文。言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Java中调用Python代码? 要不要先Mark一下,说不定将来哪天就用上了呢? 本文结构: - 需求背景 - 进击的 Python - Java 和 Python - 给 Python 加速 - 寻找方向 - Jython? - Python->Native 代码 - 整体思路 - 实际动手 - 自动化 - 关键问题 - import 的问题 - Python GIL 问题 - 测试效果 - 总结 需求背景 进击的 Python 随着人工智能的兴起,Python 这门曾经小众的编程语言可谓是焕发了第二春。 以 tensorflow、pytorch 等为主的机器学习/深度学习的开发框架大行其道,助推了 python 这门曾经以爬虫见长(python 粉别生气)的编程语言在 TIOBE 编程语言排行榜上一路披荆斩棘,坐上前三甲的宝座,仅次于 Java 和 C,将 C++、JavaScript、PHP、C#等一众劲敌斩落马下。 当然,轩辕君向来是不提倡编程语言之间的竞争对比,每一门语言都有自己的优势和劣势,有自己应用的领域。另一方面,TIOBE 统计的数据也不能代表国内的实际情况

Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

你。 提交于 2020-08-05 06:29:13
从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用。 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> x, y = 1, 2 >>> print(x, y) # 结果:1 2 在此例中,赋值操作符“=”号的右侧的两个数字会被存入到一个元组中,即变成 (1,2),然后再被解包,依次赋值给“=”号左侧的两个变量。 如果我们直接写 x = 1,2 ,然后打印出 x,或者在“=”号右侧写成一个元组,就能证实到这一点: >>> x = 1, 2 >>> print(x) # 结果:(1, 2) >>> x, y = (1, 2) >>> print(x, y) # 结果:1 2 一些博客或公众号文章在介绍到这个特性时,通常会顺着举一个例子,即基于两个变量,直接交换它们的值: >>> x, y = 1, 2 >>> x, y = y, x >>> print(x, y) # 结果:2 1 一般而言,交换两个变量的操作需要引入第三个变量。道理很简单,如果要交换两个杯子中所装的水,自然会需要第三个容器作为中转。 然而,Python 的写法并不需要借助中间变量,它的形式就跟前面的解包赋值一样。正因为这个形式相似,很多人就误以为 Python 的变量交换操作也是基于解包操作。 但是,事实是否如此呢? 我搜索了一番

4. 解密Python中最简单的对象--浮点数的底层实现

走远了吗. 提交于 2020-08-04 19:33:16
楔子 从现在开始,我们就来分析Python中常见的内置对象、以及对应的实例对象,看看它们在底层是如何实现的。但说实话,我们在前面几节中介绍对象的时候,已经说了不少了,不过从现在开始要进行更深入的分析。 除了对象本身,还要看对象支持的操作在底层是如何实现的。我们首先以浮点数为例,因为它是最简单的,没错,浮点数比整型要简单。至于为什么,当我们分析整型的时候就知道了。 内部对象 float实例对象定义在Include/floatobject.h中,结构非常简单: typedef struct { PyObject_HEAD double ob_fval; } PyFloatObject; 除了PyObject这个公共的头部信息之外,只有一个额外的ob_fval,用于存储具体的值,而且直接使用的C中的double。 那么float类型对象在底层长啥样子呢? 与实例对象不同,float类型对象全局唯一,因此可以作为全局变量定义。底层对应PyFloat_Type,位于Objects/typeobject.c中。 PyTypeObject PyFloat_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "float", sizeof(PyFloatObject), 0, (destructor)float_dealloc, /* tp