为什么 Python 集合交集比 Rust HashSet 交集更快?

2024-04-05

这是我的Python代码:

len_sums = 0
for i in xrange(100000):
    set_1 = set(xrange(1000))
    set_2 = set(xrange(500, 1500))
    intersection_len = len(set_1.intersection(set_2))
    len_sums += intersection_len
print len_sums

这是我的 Rust 代码:

use std::collections::HashSet;

fn main() {
    let mut len_sums = 0;
    for _ in 0..100000 {
        let set_1: HashSet<i32> = (0..1000).collect();
        let set_2: HashSet<i32> = (500..1500).collect();
        let intersection_len = set_1.intersection(&set_2).count();
        len_sums += intersection_len;
    }
    println!("{}", len_sums);
}

我相信这些大致相当。我得到以下性能结果:

time python set_performance.py
50000000

real    0m11.757s
user    0m11.736s
sys 0m0.012s

and

rustc set_performance.rs -O       
time ./set_performance 50000000

real    0m17.580s
user    0m17.533s
sys 0m0.032s

建筑与cargo and --release给出相同的结果。

我意识到Python的set是用C实现的,所以预计会很快,但没想到比Rust还快。难道它不需要进行 Rust 不需要的额外类型检查吗?

也许我在编译 Rust 程序的方式中遗漏了一些东西,是否还有我应该使用的其他优化标志?

另一种可能性是代码并不真正等效,Rust 正在做不必要的额外工作,我是否遗漏了什么?

Python版本:

In [3]: import sys

In [4]: sys.version
Out[4]: '2.7.6 (default, Jun 22 2015, 17:58:13) \n[GCC 4.8.2]'

锈版

$ rustc --version
rustc 1.5.0 (3d7cd77e4 2015-12-04)

我使用的是 Ubuntu 14.04,我的系统架构是 x86_64。


当我将集合构建移出循环并仅重复交集时,对于这两种情况,Rust 当然都比 Python 2.7 更快。

我只读过Python 3(设置对象.c) https://github.com/python/cpython/blob/master/Objects/setobject.c#L1274,但是 Python 的实现有一些优点。

它利用了两个 Python set 对象使用相同哈希函数的事实,因此它不会重新计算哈希。锈HashSet它们的散列函数具有实例唯一的键,因此在交集期间,它们必须将一组中的键与另一组的散列函数重新进行散列。

另一方面,Python 必须调用动态键比较函数,例如PyObject_RichCompareBool对于每个匹配的哈希,而 Rust 代码使用泛型并将专门化哈希函数和比较代码i32。哈希的代码i32Rust 看起来相对便宜,并且删除了大部分哈希算法(处理超过 4 字节的输入)。


看来是布景的构造setsPython 和 Rust 不同。事实上,不仅仅是构建,还有一些重要的代码正在运行来破坏 RustHashSet也是如此。 (这可以改进,在这里提交错误:#31711 https://github.com/rust-lang/rust/issues/31711)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 集合交集比 Rust HashSet 交集更快? 的相关文章

  • 使用 pip 或 conda 来管理包? [复制]

    这个问题在这里已经有答案了 我已经使用 matlab 进行机器学习很长一段时间了 最 近切换到 python 并使用其包管理器 pip 安装某些包并成功安装了许多包 几天前 我开始使用 conda 我以前安装的所有软件包都被覆盖 我真的很想
  • 如何在 Python 中使这个随机文本生成器更加高效?

    我正在研究一个随机文本生成器 不使用马尔可夫链 目前它的工作没有太多问题 首先 这是我的代码流程 输入一个句子作为输入 这称为触发字符串 被分配给一个变量 获取触发字符串中最长的单词 在所有古腾堡计划数据库中搜索包含该单词的句子 无论大写还
  • Django - 未找到“”的反向。 '' 不是有效的视图函数或模式名称

    我正在研究我的课程项目 但现在我完全陷入困境 我正在创建一个网站通过 PayPal 销售产品 但 PayPal 退货 取消页面未正确呈现 我已经按照课程中的示例检查了代码一百次 但显然我遗漏了一些东西 当我转到产品 单击 立即购买 登录 P
  • 使用组合时如何解决循环依赖?

    我遇到了如下所示的情况 其中每个类都需要另一个类 并且它创建了循环依赖关系 我在使用 ctypes 包装一些 C 代码时遇到了这种情况 已经有很多关于这个主题的帖子 但我发现它们没有帮助 我需要一些例子 Module A from B im
  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 表单输入框不显示

    我正在尝试使用 Django 显示一个简单的表单输入文本框 我正在亚马逊 AWS 上部署 该网站在不同的服务器 pythonanywhere 上运行良好 但在 AWS 上存在主要问题 具体来说 输入框没有被显示 我使用的模板如下 首页 ht
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • Jupyter Notebook 找不到 IQSharp

    我一直在尝试为 Quantum Katas 运行 Q 但在找到 Q 内核方面遇到了一些困难 唯一显示的内核是用于 Jupyter Notebook 的 Python 3 内核 奇怪的是 当我执行 jupyter kernalspec lis
  • 调整pandas read_sql_query NULL值处理?

    当我做 from sqlalchemy import create engine import pandas as pd engine create engine sqlite conn engine connect conn execut
  • PyQt5 - 无法使用 QVideoWidget 播放视频

    from PyQt5 QtWidgets import from PyQt5 QtMultimedia import from PyQt5 QtMultimediaWidgets import from PyQt5 QtCore impor
  • 使用 isdigit 表示浮点数?

    a raw input How much is 1 share in that company while not a isdigit print You need to write a number n a raw input How m
  • 使用Python处理Sqlite数据库中的换行符“\n”?

    我有一个名为 test db 的 Sqlite 数据库 其中包含两个表 其结构如下 表 1 ID 整数主键自动增量 名称 varchar 500 颜色 varchar 500 表2 ID INTEGER PRIMARY KEY AUTOIN
  • Dataframe unstack 性能 - pandas

    我正在尝试拆开数据框 它工作正常 但问题是我正在处理 CSV 文件中的巨大数据集 约 10 亿 这是示例数据集 236539 48512569874 Name Danny 236539 48512569874 Class 12 236539
  • Groupby Sum 忽略几列

    在此数据框中 我想按 位置 进行分组并获得 分数 的总和 但我不希望 纬度 经度 和 年份 在此过程中受到影响 sample pd DataFrame Location A B C A B C Year 2001 2002 2003 200
  • 创建 Pyomo 约束的性能

    我正在用 pyomo 设置一个更大的能量优化问题 正如其他中提到的 设置花费了不合理的时间问题 https stackoverflow com questions 43413067 performance of pyomo to gener
  • CTRL-C 在 Python 中的行为有所不同

    I ve recently started learning Python long time Java programmer here and currently in the process of writing some simple
  • 如何重定向到 warp 中带有尾部斜杠的 URL?

    我在用warp https crates io crates warp提供静态文件目录 不幸的是 当我在路径中添加尾部斜杠时 只能解析这些静态文件中使用的相对链接 这是我用来服务目录的代码 let route warp path segme
  • 如何让 IPython 按类别组织制表符补全的可能性?

    当一个对象有数百个方法时 制表符补全很难使用 通常 有趣的方法是由被检查对象的类而不是其基类定义或重写的方法 如何让 IPython 对其制表符完成可能性进行分组 以便首先检查对象的类中定义的方法和属性 然后是基类中的方法和属性 看起来像是
  • 适用于 Python 的 GitLab CI 共享 Windows 运行器

    我在 GitLab 中有一个 python 项目仓库 我看到 GitLab 共享了可用的测试版 Windows 运行程序 请参阅this https about gitlab com blog 2020 01 21 windows shar
  • Python Sqlite3 获取 Sqlite 连接路径

    给定一个 sqlite3 连接对象 如何检索 sqlite3 文件的文件路径 The Python 连接对象 http github com python cpython blob master Modules sqlite connect

随机推荐