标签 python 下的文章

Python 之父要在 Python 3.11 中将速度翻倍

在本周的美国 PyCon 语言峰会上,Python 之父 Guido 发布的一份文件,详细介绍了他要使 Python 成为一种更快的语言的野心,他承诺在 Python 3.11 中使其速度翻倍。

不过,Guido 也不敢保证一定能达成目标,只是乐观地感觉有希望。如果真的能实现,主要受益者将是那些运行 CPU 密集型纯 Python 代码的人。而对于已经用 C 语言编写的代码,如 NumPy 和TensorFlow,I/O 绑定的代码、多线程代码,以及算法效率低下的代码,不会有太大的好处。

我们真的需要更快的 Python 吗?需要更快处理的数据科学和人工智能项目,都依赖于 GPU,所以 CPU 上跑起来快不快真的没那么重要。

祝融号成功着陆火星

5 月 15 日,天问一号着陆巡视器成功着陆于火星乌托邦平原南部预选着陆区,我国首次火星探测任务着陆火星取得圆满成功。着陆巡视器与环绕器分离后,环绕器升轨返回停泊轨道,为着陆巡视器提供中继通信。着陆巡视器包括“祝融号”火星车及进入舱。后续,“祝融号”火星车将依次开展对着陆点全局成像、自检、驶离着陆平台并开展巡视探测。

恭喜我国航天航空事业取得新成就!上午有朋友问我,祝融号是否采用了开源技术?从目前公开的信息看,我们尚不知道“祝融号”所采用的技术是什么,是否涉及开源技术也不得而知。

美国政府发布行政命令,要求加强开源软件安全

5 月 12 日,美国拜登政府发布行政命令,以加强美联邦政府的网络防御,要求“在初步准则公布后的 90 天内……应发布指南,确定加强软件供应链安全的做法。”并特别提到开源软件,要求美国政府必须确保“在可行的范围内,确保产品任何部分所使用的开源软件的完整性和出处”。即提供一个软件材料清单,包含了用于构建软件的各种组件的细节和供应链关系。

Linux 基金会已经发起了诸多项目和基金会,着力于改善日益严重的开源软件安全问题。

微软搁置 Windows 10X

2019 年底,微软宣布了 Windows 10X,这是一种为双屏 PC 设计的 Windows 10 变体。据消息人士,微软今年不会推出 Windows 10X,也有可能永远搁置。该公司已将资源转移到 Windows 10,为 10X 构建的技术正在迁移到 Windows 10。

大约十年来,微软一直在尝试以各种方式使 Windows 现代化。我们已经看到了 Windows RT、Windows 10S,以及现在的 Windows 10X。

现在的问题是,除了传统的 Windows 10 之外,其它的变体是否真的有未来?

更快的 Python:Pyston 开源发布 2.2

Pyston 2.2 是 Python 3.8.8 的一个实现,他们已经将该项目开源。Pyston 提供了各种优化,关键区别在于它对 JIT 和属性缓存的使用。该项目声称“针对大型现实世界的应用,如 Web 服务,无需开发工作即可提升高达 30% 的速度"。Pyston 删除了“许多 Python 支持的很少使用的调试功能”,目的是为了提高速度,减少 Python 调试给计算机带来的负担。删除这些调试功能只实现了 2% 的性能提升,但考虑到全世界有多少台计算机在运行 Python 代码,这是有意义的。

作为一个 Python 的不同实现,依旧采取了开源道路,这值得期待。

微软宣布 Rust for Windows

在 VS Code 和 Visual Studio 中,微软已经提供了对 Rust 编程语言相当良好的支持。随着 Rust for Windows v0.9 的发布,开发者现能够以一种更加习惯的方式,访问完整的 Windows API,从而轻松构建功能强大且丰富的 Windows 应用程序。

随着 Rust 开发环境和周边支持的完善,Rust 有望成为下一个流行语言。

全球 60% 的电子邮件服务器受到已存在了 17 年的远程漏洞影响

被互联网广泛采用的 Exim 占有近 60% 的电子邮件服务器 MTA 份额。安全公司 Qualys 发现的 21 个漏洞影响了过去 17 年来发布的所有 Exim 服务器,这些漏洞被称之为 21Nails,这其中包括 10 个远程利用漏洞。如果不打补丁,可能允许恶意行为者接管这些系统,然后拦截或篡改通过 Exim 服务器的电子邮件通信。请务必尽快升级到最新的 Exim 4.94.2。

真是陈年旧洞啊,邮件服务器管理员们赶快行动起来。

苹果正在用“独有低能”的 iOS 浏览器阻碍 Web 发展

在 iOS 上,苹果希望所有的浏览器都能运行 WebKit,甚至谷歌的 Chrome 也被迫在 iOS 设备上使用 WebKit。谷歌的工程师 Alex 在一篇博文中:苹果的 Safari 浏览器和 WebKit 引擎“独有低能”,其重要功能的交付持续延迟,让 Web 永远无法成为其专有工具和 AppStore 的可靠替代品。假设苹果及时实现了 WebRTC 和游戏手柄 API。亚马逊 Luna、NVIDIA GeForce NOW、谷歌 Stadia 和微软 xCloud 有可能早几年就已经出现了。而且与竞争对手相比,iOS 浏览器在其他几个地方也功能不足。

显然,苹果为了它独特的利益,会阻止更多的竞争对手进入 iOS 生态。

AWS 在其 Lambda 中停止支持 Python 2.7

Python 3 在十多年前首次亮相时,与 Python 2 的代码并不兼容,这一点在当时引来很多讨论。但 Python 软件基金会已经在 2020 年 1 月 1 日取消了对 Python 2 的修复和支持。所以,AWS 取消对 Python 2 支持并不令人吃惊,它宣布 AWS Chalice 将跟随 Lambda 升级到更高版本,Chalice 是 Lambda 的一个框架。

虽然 Python 3 也这么多年了,但是过去三十来年积累下来的一些 Python 2 的项目和代码,并没有都得到帮助迁移到 Python 3。

PyPI 的 JSON API 是一种机器可直接使用的数据源,你可以访问和你浏览网站时相同类型的数据。

 title=

PyPI(Python 软件包索引)提供了有关其软件包信息的 JSON API。本质上,它是机器可以直接使用的数据源,与你在网站上直接访问是一样的的。例如,作为人类,我可以在浏览器中打开 Numpy 项目页面,点击左侧相关链接,查看有哪些版本,哪些文件可用以及发行日期和支持的 Python 版本等内容:

 title=

但是,如果我想编写一个程序来访问此数据,则可以使用 JSON API,而不必在这些页面上抓取和解析 HTML。

顺便说一句:在旧的 PyPI 网站上,还托管在 pypi.python.org 时,NumPy 的项目页面位于 pypi.python.org/pypi/numpy,访问其 JSON API 也很简单,只需要在最后面添加一个 /json ,即 https://pypi.org/pypi/numpy/json。现在,PyPI 网站托管在 pypi.org,NumPy 的项目页面是 pypi.org/project/numpy。新站点不会有单独的 JSON API URL,但它仍像以前一样工作。因此,你不必在 URL 后添加 /json,只要记住 URL 就够了。

你可以在浏览器中打开 NumPy 的 JSON API URL,Firefox 很好地渲染了数据:

 title=

你可以查看 inforeleaseurls 其中的内容。或者,你可以将其加载到 Python Shell 中,以下是几行入门教程:

import requests
url = "https://pypi.org/pypi/numpy/json"
r = requests.get(url)
data = r.json()

获得数据后(调用 .json() 提供了该数据的 字典),你可以对其进行查看:

 title=

查看 release 中的键:

 title=

这表明 release 是一个以版本号为键的字典。选择一个并查看以下内容:

 title=

每个版本都包含一个列表,release 包含 24 项。但是每个项目是什么?由于它是一个列表,因此你可以索引第一项并进行查看:

 title=

这是一个字典,其中包含有关特定文件的详细信息。因此,列表中的 24 个项目中的每一个都与此特定版本号关联的文件相关,即在 https://pypi.org/project/numpy/1.20.1/#files 列出的 24 个文件。

你可以编写一个脚本在可用数据中查找内容。例如,以下的循环查找带有 sdist(源代码包)的版本,它们指定了 requires_python 属性并进行打印:

for version, files in data['releases'].items():
    for f in files:
        if f.get('packagetype') == 'sdist' and f.get('requires_python'):
            print(version, f['requires_python'])

 title=

piwheels

去年,我在 piwheels 网站上实现了类似的 APIpiwheels.org 是一个 Python 软件包索引,为树莓派架构提供了 wheel(预编译的二进制软件包)。它本质上是 PyPI 软件包的镜像,但带有 Arm wheel,而不是软件包维护者上传到 PyPI 的文件。

由于 piwheels 模仿了 PyPI 的 URL 结构,因此你可以将项目页面 URL 的 pypi.org 部分更改为 piwheels.org。它将向你显示类似的项目页面,其中详细说明了构建的版本和可用的文件。由于我喜欢旧站点允许你在 URL 末尾添加 /json 的方式,所以我也支持这种方式。NumPy 在 PyPI 上的项目页面为 pypi.org/project/numpy,在 piwheels 上,它是 piwheels.org/project/numpy,而 JSON API 是 piwheels.org/project/numpy/json 页面。

没有必要重复 PyPI API 的内容,所以我们提供了 piwheels 上可用内容的信息,包括所有已知发行版的列表,一些基本信息以及我们拥有的文件列表:

 title=

与之前的 PyPI 例子类似,你可以创建一个脚本来分析 API 内容。例如,对于每个 NumPy 版本,其中有多少 piwheels 文件:

import requests

url = "https://www.piwheels.org/project/numpy/json"
package = requests.get(url).json()

for version, info in package['releases'].items():
    if info['files']:
        print('{}: {} files'.format(version, len(info['files'])))
    else:
        print('{}: No files'.format(version))

此外,每个文件都包含一些元数据:

 title=

方便的是 apt_dependencies 字段,它列出了使用该库所需的 Apt 软件包。本例中的 NumPy 文件,或者通过 pip 安装 Numpy,你还需要使用 Debian 的 apt 包管理器安装 libatlas3-baselibgfortran

以下是一个示例脚本,显示了程序包的 Apt 依赖关系:

import requests

def get_install(package, abi):
    url = 'https://piwheels.org/project/{}/json'.format(package)
    r = requests.get(url)
    data = r.json()
    for version, release in sorted(data['releases'].items(), reverse=True):
        for filename, file in release['files'].items():
            if abi in filename:
                deps = ' '.join(file['apt_dependencies'])
                print("sudo apt install {}".format(deps))
                print("sudo pip3 install {}=={}".format(package, version))
                return

get_install('opencv-python', 'cp37m')
get_install('opencv-python', 'cp35m')
get_install('opencv-python-headless', 'cp37m')
get_install('opencv-python-headless', 'cp35m')

我们还为软件包列表提供了一个通用的 API 入口,其中包括每个软件包的下载统计:

import requests

url = "https://www.piwheels.org/packages.json"
packages = requests.get(url).json()
packages = {
    pkg: (d_month, d_all)
    for pkg, d_month, d_all, \*_ in packages
}

package = 'numpy'
d_month, d_all = packages[package]

print(package, "has had", d_month, "downloads in the last month")
print(package, "has had", d_all, "downloads in total")

pip search

pip search 因为其 XMLRPC 接口过载而被禁用,因此人们一直在寻找替代方法。你可以使用 piwheels 的 JSON API 来搜索软件包名称,因为软件包的集合是相同的:

#!/usr/bin/python3
import sys

import requests

PIWHEELS_URL = 'https://www.piwheels.org/packages.json'

r = requests.get(PIWHEELS_URL)
packages = {p[0] for p in r.json()}

def search(term):
    for pkg in packages:
        if term in pkg:
            yield pkg

if __name__ == '__main__':
    if len(sys.argv) == 2:
        results = search(sys.argv[1].lower())
        for res in results:
            print(res)
    else:
        print("Usage: pip_search TERM")

有关更多信息,参考 piwheels 的 JSON API 文档.


本文最初发表在 Ben Nuttall 的 Tooling Tuesday 博客上,经许可转载使用。


via: https://opensource.com/article/21/3/python-package-index-json-apis-requests

作者:Ben Nuttall 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。

 title=

Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,Cython 也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。

Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。

安装 Cython

你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python:

$ python -m pip install Cython

安装好后,就可以使用它了。

将 Python 转换成 C

使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。

首先,创建一个简单的 Python 脚本,文件命名为 hello.pyx.pyx 扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名):

print("hello world")

接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的 setup.py,Cython 可以使用它来处理你的 Python 代码:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("hello.pyx")
)

最后,使用 Cython 将你的 Python 脚本转换为 C 代码:

$ python setup.py build_ext --inplace

你可以在你的工程目录中看到结果。Cython 的 cythonize 模块将 hello.pyx 转换成一个 hello.c 文件和一个 .so 库。这些 C 代码有 2648 行,所以它比一个一行的 hello.pyx 源码的文本要多很多。.so 库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的 hello.pyx 文件。

要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新 hello 模块:

>>> import hello
hello world

将 C 代码集成到 Python 中

测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。

import sys

number = int(sys.argv[1])
if not number <= 1:
    for i in range(2, number):
        if (number % i) == 0:
            print("Not prime")
            break
else:
    print("Integer must be greater than 1")

这个脚本在成功的时候是不会提醒的,如果这个数不是质数,则返回一条信息:

$ ./prime.py 3
$ ./prime.py 4
Not prime.

将这些转换为 Cython 需要一些工作,一部分是为了使代码适合用作库,另一部分是为了提高性能。

脚本和库

许多用户将 Python 当作一种脚本语言来学习:你告诉 Python 想让它执行的步骤,然后它来做。随着你对 Python(以及一般的开源编程)的了解越多,你可以了解到许多强大的代码都存在于其他应用程序可以利用的库中。你的代码越 不具有针对性,程序员(包括你)就越可能将其重用于其他的应用程序。将计算和工作流解耦可能需要更多的工作,但最终这通常是值得的。

在这个简单的质数计算的例子中,将其转换成 Cython,首先是一个设置脚本:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("prime.py")
)

将你的脚本转换成 C:

$ python setup.py build_ext --inplace

到目前为止,一切似乎都工作的很好,但是当你试图导入并使用新模块时,你会看到一个错误:

>>> import prime
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "prime.py", line 2, in init prime
    number = sys.argv[1]
IndexError: list index out of range

这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。

写一个库

库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用 sys.argv,不如将你的代码封装成一个函数来接收一个叫 number(或者 num,或者任何你喜欢的变量名)的参数:

def calculate(number):
    if not number <= 1:
        for i in range(2, number):
            if (number % i) == 0:
                print("Not prime")
                break
    else:
        print("Integer must be greater than 1")

这确实使你的脚本有些难以测试,因为当你在 Python 中运行代码时,calculate 函数永远不会被执行。但是,Python 编程人员已经为这个问题设计了一个通用、还算直观的解决方案。当 Python 解释器执行一个 Python 脚本时,有一个叫 __name__ 的特殊变量,这个变量被设置为 __main__,但是当它被作为模块导入的时候,__name__ 被设置为模块的名字。利用这点,你可以写一个既是 Python 模块又是有效 Python 脚本的库:

import sys

def calculate(number):
    if not number <= 1:
        for i in range(2, number):
            if (number % i) == 0:
                print("Not prime")
                break
    else:
        print("Integer must be greater than 1")

if __name__ == "__main__":
    number = sys.argv[1]    
    calculate( int(number) )

现在你可以用一个命令来运行代码了:

$ python ./prime.py 4
Not a prime

你可以将它转换为 Cython 来用作一个模块:

>>> import prime
>>> prime.calculate(4)
Not prime

C Python

用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。


via: https://opensource.com/article/21/4/cython

作者:Alan Smithee 选题:lujun9972 译者:ShuyRoy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

比特币十日大跌 26%

据非小号行情数据,自比特币 2021 年 4 月 14 日涨至 64354 美元大关刷新历史新高后,很快价格便出现逐步回调。第一次大跌出现在 4 月 18 日,一度跌至 54009 美元;第二次大跌则在 4 月 23 日,比特币价格再次从 55000 美元跳水至 47600 美元。十日内,比特币价格已大跌 26%,市值蒸发数千亿美元。其他主流虚拟货币也出现下跌。截至 4 月 25 日18时,以太坊、瑞波币、莱特币等币种,价格均较前段时间的高位下跌逾 10%-20% 不等。

据分析,比特币近期大跌主要是受外部因素影响。有人称“比特币是乌托邦,目前已进入‘自娱自乐’的泡沫最后阶段”。也有人认为,比特币在不依赖任何中心化机构的情况下良好运营了十余年,自然有其内在的技术与价值逻辑,业内应当理性看待比特币的投资价值。

作为比特币的坚定支持者,我是希望过热的比特币价格应该降温一下,按历史轨迹,每次大周期调整幅度要远远高于现在的跌幅。

Mozilla 剥离 Pyodide 项目:可以在浏览器中运行的 Python

Pyodide 已经被 Mozilla 剥离出来,成为一个独立的、由社区驱动的项目。Pyodide 由编译成 WebAssembly 的 CPython 3.8 解释器组成,允许 Python 在网页浏览器中运行。Pyodide 项目将在 GitHub 拥有一个新的家

Pyodide 可以安装来自 PyPi 的任何 Python 包。Pyodide 还包括一个外部函数接口,可以将 Python 包暴露给 JavaScript,并将浏览器 UI,包括 DOM,暴露给 Python。该项目还使许多 Python 科学包,包括 NumPy、Pandas、Matplotlib、SciPy 和 Scikit-learn,可以在浏览器中运行。

“你已经是一个大孩子了,可以自己生活了”,感觉 Mozilla 孵化出来了很多有趣的项目。

Linux 5.12 发布,但下一个版本可能会相当庞大

Linus Torvalds 已经发布了 5.12 版本的 Linux 内核。新版本中:Linux 可以作为 Hyper-V 的根分区;对用于物联网设备的管理程序 ACRN 的更多支持;识别博通公司的 VK 加速器,可以将视频转码等工作负载转移到专用设备上。

Linus Torvalds 写道:“尽管多花了一周时间,但这实际上是一个相当小的版本。从 Linux-next 来看,5.13 将会更大。”在 5.13 中会增加对苹果 M1 芯片的支持。