标签 python 下的文章

FSF 指谷歌在 WEI 上的做法是“邪恶先锋”

自由软件基金会(FSF)的 Greg Farough 批评谷歌提出的网络环境完整性(WEI)是对自由互联网的全面攻击。称该政策文件所强调的使用案例与其真正的使用案例相比,简直是小巫见大巫,因为其真正的使用案例是制定一种方法来完全彻底地限制互联网的自由。借助 WEI,政府将可以利用它来确保只有其官方 “批准”(读作:后门)的浏览器才能访问互联网;Netflix 等公司将利用它来推进数字限制管理(DRM);谷歌将利用它来拒绝用户访问其服务,除非用户使用的浏览器符合其利润率。最初 WEI 还只是发布在 GitHub 上的一份无伤大雅的 政策文件,但谷歌现在已将其快速发展到 Chromium 浏览器中,WEI 将很快就会出现在我们面前。他说,“曾经有段时间谷歌的理念是‘不作恶’,它如此短时间内就在 WEI 上取得进展,我们可以非常肯定地说,他们现在的政策是要成为邪恶先锋。”

消息来源:FSF
老王点评:很多人没太理解 WEI 的危害,而这篇文章清晰的分析了其潜在的危害。但是,这种程度的社区抗议恐怕无济于事。谷歌比较忌惮的是其它企业和政府对它的反对。除了支持 Firefox 这类自由的浏览器之外,我们还可以寄希望于在其它的 Chromium 下游版本中去除 WEI。

AlmaLinux 向红帽示好,被拒绝了

红帽关闭 CentOS,推行 CentOS Stream 成为 RHEL 上游,其中一个理由是希望社区来参与 CentOS Stream/RHEL 的开发,并指责 AlmaLinux 等 RHEL 克隆品只是简单的重建,而没有做出任何贡献。而 AlamLinux 一方面表示将不再寻求 1:1 克隆,将在 RHEL 之外合并补丁,另外一方面“也尝试在 CentOS Stream 中测试和复制问题”,以示好红帽。最近,AlmaLinux 提交了一个 Iperf3 的 CVE 修复到 CentOS Stream。但红帽公司的一位高级软件工程师回复说:“感谢您的贡献。目前,我们不打算在 RHEL 中解决这个问题,不过我们会根据客户需求继续评估。”AlamLinux 不理解“只需合并即可,为什么还要拒绝修复呢?”之前曾经称 AlmaLinux 等“只是简单地重建代码”的红帽公司核心平台(又名 RHEL)副总裁 Mike McGrath 对 AlmaLinux 表示了感谢,但拒绝了这些代码。事后,McGrath 承认错失了对 AlmaLinux 表达善意的机会,并提升了该 CVE 的等级,合并了这些代码。

消息来源:ZDNet
老王点评:只是说说而已,谁让你真提交代码了,没事就给添乱,你知道你提交了代码,红帽要做作多少回归测试吗。

Python 接受可选全局解释器锁提案

Python 指导委员会宣布,它计划接受 PEP 703,让全局解释器锁成为可选,即 No-GIL 模式。预计将在 Python 3.13 初步支持该模式。CPython 的全局解释器锁(GIL)阻止了同时多线程执行代码,成为了在多核 CPU 上提高 Python 代码运行效率的一大障碍。Meta 公司承诺为 PEP 703 提案提供 人力支持。Python 指导委员会强调了兼容性的重要性,要避免出现类似 Python 3 的情况,称它不是 Python 4。

消息来源:Python 基金会
老王点评:不是 Python 4,胜似 Python 4,这一改进对将 Python 应用到重要领域很有意义。

Twitter 抢夺了已注册 16 年的 @X 账号

马斯克将 Twitter 品牌重塑为 “X”,其蓝鸟标志也改为 X,但 Twitter 上的 @X 账号并没有控制在 Twitter 手中,它早在 16 年前就被用户使用了。如果 Twitter 的官方账号没有改为 @X,那么马斯克此番重塑商标的动作显然是不完整的。所以他们直接接管了 @X 账号。Twitter 之前的服务条款允许它接管任何用户名。该账号的原拥有者、旧金山摄影师 Gene X Hwang 称他们发了封邮件,说该账号是 X 的财产。Twitter 没有提供任何经济补偿,只是让他创建一个新账号,为其转移历史记录等信息,以及提供一些纪念品和与管理团队见面等机会。

消息来源:Ars Technica
老王点评:虽然很令人遗憾,但是你在所有中心化平台注册的账号名,其实都不属于你,平台方可以任意拿走。

联合国教科文组织呼吁全球禁止在学校使用智能手机

联合国教科文组织说,有证据表明,过度使用手机与学习成绩下降有关,而且大量的屏幕时间会对儿童的情绪稳定产生负面影响。呼吁禁止使用智能手机发出了一个明确的信息,即包括人工智能在内的整个数字技术应始终服从于 “以人为本的教育理念”,绝不能取代与教师面对面的交流。教科文组织警告政策制定者不要不假思索地拥抱数字技术,认为数字技术对学习成果和经济效率的积极影响可能被夸大,而且“并非所有变化都是进步,可以做的事情并不意味着应该做”。

消息来源:卫报
老王点评:作为一个焦虑的父亲,从未觉得教科文组织的话这么正确过。?有一点非常赞同,“并非所有变化都是进步”。

偷偷摸摸的 Python 软件包安全修复对谁都没好处

Python 的安全修复通常是通过 “静默” 的代码提交实现的,没有相关的 CVE 标识符。这导致不是安全专家的开发人员可能无法识别上游提交针对的是与其代码相关的可利用漏洞,从而没有修复该安全漏洞的紧迫性。有人提出了一种补救措施:建立一个名为 PySecDB 的安全提交数据库,让 Python 代码的修复对社区更加可见。这是 Python 中第一个安全提交数据集,它涵盖了 119 个以上的 CWE 分类。Python 基金会的安全研究人员表示,将会注册为 CVE 编号机构以改善这种情况。

消息来源:The Register
老王点评:这样的措施,应该对其它的语言和模块仓库有借鉴价值。

研究发现更大的上下文对大语言模型来说意义不大

在大语言模型中,上下文窗口指的是模型在给定实例中可以处理和响应的文本长度。它可以被视为特定文本分析或聊天机器人对话的工作记忆。许多人都认为,语境窗口变大的趋势将继续提高 大语言模型的性能和在各种应用中的实用性。但根据一项最新研究,大语言模型往往无法访问和使用在较长的上下文窗口中提供给它们的相关信息。当相关信息出现在输入上下文的开头或结尾时,它的性能最佳;而当模型必须在长上下文中间获取相关信息时,性能就会明显下降。此外,随着输入上下文的长度增加,即使是明确的长上下文模型,性能也会大幅下降。

消息来源:Venture Beat
老王点评:可见我们对大语言模型内部到底发生了什么,还是一无所知。

谷歌敦促 Gmail 用户启用 “增强型安全浏览”

这项增强的安全功能已经存在了三年,但谷歌最近开始在 Gmail 收件箱中显示一条信息,建议人们打开 “增强安全浏览” 功能。如果谷歌认为你正在浏览的网站冒充你的银行等,你就会看到一个红色的警告屏幕。一般而言,开启这项安全功能是个好主意,虽然它会收集你的更多信息,但如果你本来就使用了 Gmail 等谷歌服务,其实它已经收集了足够多的信息。如果你开启了该功能,即使你没有登录谷歌账户,谷歌也会对你访问的网站了如指掌。它还会从你访问的网站上收集一些视觉图像,以扫描诈骗网站的特征。

消息来源:MSN
老王点评:你应该自己决定是否愿意放弃部分隐私来换取额外的安全保护,以防止常见的犯罪行为。

五年后,Cython 3.0 发布

Cython 是一种基于 Python 的编程语言和编译器,它可以编译输出原生代码,执行速度可能比 CPython 解释器快得多。它既可用于优化 Python 应用程序,也可用于创建 CPython 可使用的模块,从而在解释器中运行应用程序的主要部分时,编译性能关键的代码。Cython 至今已有 21 年历史。在接近五年的漫长时间后,Cython 3.0 发布,增加了许多新功能,现在支持 Python 3 的所有版本,但放弃了对 Python 2.6 的支持。但 Cython 2.x 和 Cython 3.0 之间的兼容性问题已经造成了一些问题,影响到了包括 AWS CLI 在内的一些重要项目。

消息来源:Dev Class
老王点评:觉得 Python 慢吗?那就编译好了。

OpenAI 拿出五分之一的算力来防止人工智能“叛变”

OpenAI 认为,能够超越人类智慧并压倒人类的计算机系统可能会在这个十年内被开发出来,“但超级智能的巨大力量也可能非常危险,可能导致人类丧失能力,甚至人类灭绝。”OpenAI 的既定目标一直是安全地开发人工通用智能,但这项技术目前还不存在。OpenAI 希望建立一个人工智能系统在不明确依赖人类的情况下,使其他机器与人类的价值观保持一致。为此,他们打算拿出 20% 的处理能力,并成立一个由其首席科学家领导的新部门,以某种方式防止未来机器危害人类。其设定的目标是在四年内解决人工智能和人类行为对齐的问题。

消息来源:The Register
老王点评:那如何防止监管人工智能的人工智能叛变或合谋呢?从本质上来说,除非人工智能也具有自限性,就像大自然中的很多物种一样,能够和人类和其它生物形成共存条件,否则人工智能最终将是无法控制的。在这方面,我是悲观主义者。

Meta 向 Python 提议可选全局解释器锁功能

CPython 的全局解释器锁(GIL)阻止了多线程同时执行代码,这事实上阻碍了在多核 CPU 上提高 Python 代码的运行效率。Meta 正致力于推动 Python 项目采纳 PEP 703 提案,该提案将使全局解释器锁成为可选,并加入了必要的更改以确保解释器线程安全。Meta 还承诺,如果 PEP 703 提案被接受,它将在 2025 年前投入三个工程师年的人力,与核心团队合作去实现 PEP 703。

消息来源:Solidot
老王点评:Python 如果要想进一步发展,那么打破原有的一些制约是必经之路,否则就会像其它语言一样,逐渐老化。比如 Perl。

谷歌建议为人工智能更新 robots.txt 文件

人工智能公司大量使用了从互联网上刮取的内容进行训练,而很多内容是受版权保护的。谷歌建议网络和人工智能社区来讨论改进 robots.txt 标准,以应对人工智能刮取内容的需要。robots.txt 是一个由社区开发的网络标准,它诞生于近 30 年前,已被证明是网络发布者控制搜索引擎抓取其内容的一种简单而透明的方式。但 robots.txt 并不具有法律约束力,只是一种善意的指示。

消息来源:Slashdot
老王点评:虽然不具备法律效力,但是至少为人工智能抓取制定了一个行为准则和法律底线。

Rust 和 Python 的优势互补。可以使用 Python 进行原型设计,然后将性能瓶颈转移到 Rust 上。

Python 和 Rust 是非常不同的语言,但它们实际上非常搭配。但在讨论如何将 Python 与 Rust 结合之前,我想先介绍一下 Rust 本身。你可能已经听说了这种语言,但可能还没有了解过它的细节。

什么是 Rust?

Rust 是一种低级语言,这意味着程序员所处理的东西接近于计算机的 “真实” 运行方式。

例如,整数类型由字节大小定义,与 CPU 支持的类型相对应。虽然我们很想简单地说 Rust 中的 a+b 对应于一条机器指令,但实际上并不完全是这样!

Rust 编译器链非常复杂。作为第一种近似的方法,将这样的语句视为 “有点” 真实是有用的。

Rust 旨在实现零成本抽象,这意味着许多语言级别可用的抽象在运行时环境中会被编译去掉。

例如,除非明确要求,对象会在堆栈上分配。结果是,在 Rust 中创建本地对象没有运行时成本(尽管可能需要进行初始化)。

最后,Rust 是一种内存安全的语言。也有其他内存安全的语言和其他支持零成本抽象的语言。但通常这些是两类不同的语言。

内存安全并不意味着不可能在 Rust 中出现内存违规。它确实意味着只有两种方式可能导致内存违规:

  • 编译器的错误。
  • 显式声明为不安全(unsafe)的代码。

Rust 标准库代码有很多被标记为不安全的代码,虽然比许多人预期的少。这并不意味着该语句无意义。除了需要自己编写不安全代码的(罕见的)情况外,内存违规通常是由基础设施造成的。

为什么会有 Rust 出现?

为什么人们要创建 Rust?是哪些问题没有被现有编程语言解决吗?

Rust 被设计成既能高效运行,又保证内存安全。在现代的联网世界中,这是一个越来越重要的问题。

Rust 的典型应用场景是协议的低级解析。待解析的数据通常来自不受信任的来源,并且需要通过高效的方式进行解析。

如果你认为这听起来像 Web 浏览器所做的事情,那不是巧合。Rust 最初起源于 Mozilla 基金会,它是为了改进 Firefox 浏览器而设计的。

如今,需要保证安全和速度的不仅仅是浏览器。即使是常见的微服务架构也必须能够快速解析不受信任的数据,同时保证安全。

现实示例:统计字符

为了理解 “封装 Rust” 的例子,需要解决一个问题。这个问题需要满足以下要求:

  • 足够容易解决。
  • 能够写高性能循环来优化。
  • 有一定的现实意义。

这个玩具问题的例子是判断一个字符在一个字符串中是否出现超过了 X 次。这个问题不容易通过高效的正则表达式解决。即使是专门的 Numpy 代码也可能不够快,因为通常没有必要扫描整个字符串。

你可以想象一些 Python 库和技巧的组合来解决这个问题。然而,如果在低级别的语言中实现直接的算法,它会非常快,并且更易于阅读。

为了使问题稍微有趣一些,以演示 Rust 的一些有趣部分,这个问题增加了一些变化。该算法支持在换行符处重置计数(意即:字符是否在一行中出现了超过 X 次?)或在空格处重置计数(意即:字符是否在单词中出现了超过 X 次?)。

这是唯一与 “现实性” 相关的部分。过多的现实性将使这个示例在教育上不再有用。

支持枚举

Rust 支持使用枚举(enum)。你可以使用枚举做很多有趣的事情。

目前,只使用了一个简单的三选一的枚举,并没有其他的变形。这个枚举编码了哪种字符重置计数。

#[derive(Copy)]
enum Reset {
    NewlinesReset,
    SpacesReset,
    NoReset,
}

支持结构

接下来的 Rust 组件更大一些:这是一个结构(struct)。Rust 的结构与 Python 的 dataclass 有些相似。同样,你可以用结构做更复杂的事情。

#[pyclass]
struct Counter {
    what: char,
    min_number: u64,
    reset: Reset, 
}

实现块

你可以在 Rust 中使用一个单独的块,称为实现(impl)块,为结构添加一个方法。但具体细节超出了本文的范围。

在这个示例中,该方法调用了一个外部函数。这主要是为了分解代码。更复杂的用例将指示 Rust 编译器内联该函数,以便在不产生任何运行时成本的情况下提高可读性。

#[pymethods]
impl Counter {
    #[new]
    fn new(what: char, min_number: u64, reset: Reset) -> Self {
        Counter{what: what, min_number: min_number, reset: reset}
    }
    
    fn has_count(
        &self,
        data: &str,
    ) -> bool {
        has_count(self, data.chars())
    }
}

函数

默认情况下,Rust 变量是常量。由于当前的计数(current_count)必须更改,因此它被声明为可变变量。

fn has_count(cntr: &Counter, chars: std::str::Chars) -> bool {
    let mut current_count : u64 = 0;
    for c in chars {
        if got_count(cntr, c, &mut current_count) {
            return true;
        }
    }
    false
}

该循环遍历字符并调用 got_count 函数。再次强调,这是为了将代码分解成幻灯片展示。它展示了如何向函数发送可变引用。

尽管 current_count 是可变的,但发送和接收站点都显式标记该引用为可变。这可以清楚地表明哪些函数可能修改一个值。

计数

got_count 函数重置计数器,将其递增,然后检查它。Rust 的冒号分隔的表达式序列评估最后一个表达式的结果,即是否达到了指定的阈值。

fn got_count(cntr: &Counter, c: char, current_count: &mut u64) -> bool {
    maybe_reset(cntr, c, current_count);
    maybe_incr(cntr, c, current_count);
    *current_count >= cntr.min_number
}

重置代码

reset 的代码展示了 Rust 中另一个有用的功能:模式匹配。对 Rust 中匹配的完整描述需要一个学期级别的课程,不适合在一个无关的演讲中讲解。这个示例匹配了该元组的两个选项之一。

fn maybe_reset(cntr: &Counter, c: char, current_count: &mut u64) -> () {
    match (c, cntr.reset) {
        ('\n', Reset::NewlinesReset) | (' ', Reset::SpacesReset)=> {
            *current_count = 0;
        }
        _ => {}
    };
}

增量支持

增量将字符与所需字符进行比较,并在匹配时增加计数。

fn maybe_incr(cntr: &Counter, c: char, current_count: &mut u64) -> (){
    if c == cntr.what {
        *current_count += 1;
    };
}

请注意,我在本文中优化了代码以适合幻灯片。这不一定是 Rust 代码的最佳实践示例,也不是如何设计良好的 API 的示例。

为 Python 封装 Rust 代码

为了将 Rust 代码封装到 Python 中,你可以使用 PyO3。PyO3 Rust “crate”(即库)允许内联提示将 Rust 代码包装为 Python,使得修改两者更容易。

包含 PyO3 crate 原语

首先,你必须包含 PyO3 crate 原语。

use pyo3::prelude::*;

封装枚举

枚举需要被封装。derive 从句对于将枚举封装为 PyO3 是必需的,因为它们允许类被复制和克隆,使它们更容易在 Python 中使用。

#[pyclass]
#[derive(Clone)]
#[derive(Copy)]
enum Reset {
    /* ... */
}

封装结构

结构同样需要被封装。在 Rust 中,这些被称为 “宏”,它们会生成所需的接口位。

#[pyclass]
struct Counter {
    /* ... */
}

封装实现

封装实现(impl)更有趣。增加了另一个名为 new 的宏。此方法被标记为 #[new],让 PyO3 知道如何为内置对象公开构造函数。

#[pymethods]
impl Counter {
    #[new]
    fn new(what: char, min_number: u64,
          reset: Reset) -> Self {
        Counter{what: what,
          min_number: min_number, reset: reset}
    }
    /* ... */
}

定义模块

最后,定义一个初始化模块的函数。此函数具有特定的签名,必须与模块同名,并用 #[pymodule] 修饰。

#[pymodule]
fn counter(_py: Python, m: &PyModule
) -> PyResult<()> {
    m.add_class::<Counter>()?;
    m.add_class::<Reset>()?;
    Ok(())
}

? 显示此函数可能失败(例如,如果类没有正确配置)。 PyResult 在导入时转换为 Python 异常。

Maturin 开发

为了快速检查,用 maturin develop 构建并将库安装到当前虚拟环境中。这有助于快速迭代。

$ maturin develop

Maturin 构建

maturin build 命令构建一个 manylinux 轮子,它可以上传到 PyPI。轮子是特定于 CPU 架构的。

Python 库

从 Python 中使用库是最简单的部分。没有任何东西表明这与在 Python 中编写代码有什么区别。这其中的一个有用方面是,如果你优化了已经有单元测试的 Python 中的现有库,你可以使用 Python 单元测试来测试 Rust 库。

导入

无论你是使用 maturin develop 还是 pip install 来安装它,导入库都是使用 import 完成的。

import counter

构造函数

构造函数的定义正好使对象可以从 Python 构建。这并不总是如此。有时仅从更复杂的函数返回对象。

cntr = counter.Counter(
    'c',
    3,
    counter.Reset.NewlinesReset,
)

调用函数

最终的收益终于来了。检查这个字符串是否至少有三个 “c” 字符:

>>> cntr.has_count("hello-c-c-c-goodbye")
True

添加一个换行符会触发剩余操作,这里没有插入换行符的三个 “c” 字符:

>>> cntr.has_count("hello-c-c-\nc-goodbye")
False

使用 Rust 和 Python 很容易

我的目标是让你相信将 Rust 和 Python 结合起来很简单。我编写了一些“粘合剂”代码。Rust 和 Python 具有互补的优点和缺点。

Rust 非常适合高性能、安全的代码。Rust 具有陡峭的学习曲线,对于快速原型解决方案而言可能有些笨拙。

Python 很容易入手,并支持非常紧密的迭代循环。Python 确实有一个“速度上限”。超过一定程度后,从 Python 中获得更好的性能就更难了。

将它们结合起来完美无缝。在 Python 中进行原型设计,并将性能瓶颈移至 Rust 中。

使用 Maturin,你的开发和部署流程更容易进行。开发、构建并享受这一组合吧!


via: https://opensource.com/article/23/3/python-loves-rust

作者:Moshe Zadka 选题:lkxed 译者:ChatGPT 校对:wxy

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

Meta 公布革命性可扩展模型架构 Megabyte

如今热捧的生成式 AI 模型,如 GPT-4 等,都是基于谷歌 2017 年提出的 转换器 Transformer 架构。Meta 的研究人员认为该架构存在两大设计缺陷:其一,转换器模型需要关注所有令牌,当需要处理的令牌数以千计时,计算非常密集。其二,采用了串行计算模式,存在扩展性难题。Meta 公司发表论文,提出了一种革命性的可扩展模型架构 Megabyte。它将输入输出序列分割为“补丁”而不是“令牌”。Megabyte 可以并行进行计算,在每个补丁中,局部 AI 生成结果,全局模型负责协调所有补丁的最终输出,从而解决了扩展性问题。测试显示,有 15 亿参数的 Megabyte 模型比有 3.5 亿参数的转换器模型生成序列快 40%。Megabyte 模型能支持最多 120 万个令牌,相比下 GPT-4 是 3.2 万个令牌,Claude 是 10 万个令牌。

消息来源:Artisana
老王点评:令人称奇的是,在这次 AI 竞赛中,Meta 频繁地爆出新成果,虽然目前还不能完全盖住 OpenAI 和微软的风头,但是给人的感觉很有希望。

PyPI 向法庭提供了用户记录

Python 软件基金会披露,它根据美国司法部的要求提供了其软件包仓库 PyPI 的用户数据。法庭传票要求提供 5 个用户的用户名、网名、邮寄地址、公司地址、电子邮件地址、连接记录,会话时间和持续时长以及相关 IP 记录,以及,他们上传的 PyPI 软件包记录和这些软件包的下载 IP 日志等等。Python 软件基金会在与律师讨论之后满足了传票要求。

消息来源:Python 软件基金会
老王点评:说起来,这些软件基金会和软件仓库都没有受我国法律管辖的吧。

Thunderbird 发布全新徽标

在将近二十年之后,Thunderbird 项目发布了全新徽标。新徽标与 Mozilla Firefox 浏览器的徽标风格相似,开发者表示这是为了纪念其历史和与 Mozilla 的重要联系,向下一个 20 年前进。该徽标的设计师也是 Firefox 和 Thunderbird 原徽标的设计者。

消息来源:Thunderbird
老王点评:我觉得不如原来的好看,不过这不重要,重要的是,Thunderbird 终于有了更多实质性的改进,比如提供移动版本。