Python 中的快速字符串到整数转换

2023-12-21

实际上,这是一个简单的问题:您有 10 亿 (1e+9) 个无符号 32 位整数作为十进制 ASCII 字符串存储在 TSV(制表符分隔值)文件中。转换使用int()与处理相同数据集的其他工具相比,速度非常慢。为什么?更重要的是:如何让它更快?

因此问题是:在Python中将字符串转换为整数的最快方法是什么?

我真正想到的是一些半隐藏的 Python 功能,可以(滥用)用于此目的,与 Guido 的使用不同array.array in his 《优化轶事》 http://www.python.org/doc/essays/list2str/.

样本数据(制表符扩展为空格)

38262904        "pfv"              2002-11-15T00:37:20+00:00
12311231        "tnealzref"        2008-01-21T20:46:51+00:00
26783384        "hayb"             2004-02-14T20:43:45+00:00
812874          "qevzasdfvnp"      2005-01-11T00:29:46+00:00
22312733        "bdumtddyasb"      2009-01-17T20:41:04+00:00

读取数据所花费的时间在这里无关紧要,处理数据才是瓶颈。

微基准测试

以下所有语言都是解释性语言。主机运行 64 位 Linux。

Python 2.6.2 和 IPython 0.9.1,每秒约 214k 次转换 (100%):

In [1]: strings = map(str, range(int(1e7)))

In [2]: %timeit map(int, strings);
10 loops, best of 3: 4.68 s per loop

REBOL 3.0 版本 2.100.76.4.2,~231kcps (108%):

>> strings: array n: to-integer 1e7 repeat i n [poke strings i mold (i - 1)]
== "9999999"

>> delta-time [map str strings [to integer! str]]
== 0:00:04.328675

REBOL 2.7.6.4.2(2008 年 3 月 15 日),~523kcps (261%):

正如约翰在评论中指出的那样,这个版本确实not构建一个转换后的整数列表,因此给出的速度比是相对于 Python 的 4.99s 运行时间for str in strings: int(str).

>> delta-time: func [c /local t] [t: now/time/precise do c now/time/precise - t]

>> strings: array n: to-integer 1e7 repeat i n [poke strings i mold (i - 1)]
== "9999999"

>> delta-time [foreach str strings [to integer! str]]
== 0:00:01.913193

KDB+ 2.6t 2009.04.15, ~2016kcps (944%):

q)strings:string til "i"$1e7

q)\t "I"$strings
496

以下最简单的 C 扩展已经在内置方面有了很大的改进,每秒转换的字符串数量是原来的三倍以上(650kcps 与 214kcps):

static PyObject *fastint_int(PyObject *self, PyObject *args) {
    char *s; unsigned r = 0;
    if (!PyArg_ParseTuple(args, "s", &s)) return NULL;
    for (r = 0; *s; r = r * 10 + *s++ - '0');
    return Py_BuildValue("i", r);
}

这显然不能满足任意长度的整数和各种其他特殊情况,但这在我们的场景中没有问题。

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

Python 中的快速字符串到整数转换 的相关文章

随机推荐

  • org.hibernate.InstantiationException:实体没有默认构造函数::principal.Cliente

    我遇到这个错误 Exception in thread main org hibernate InstantiationException No default constructor for entity principal Client
  • Docker Compose + Postgres:公开端口

    我目前正在尝试将 Docker 用于我的新 Django Postgres 项目 我在 Mac 上工作 通常使用 Postico 快速连接到我的数据库 我曾经这样连接 我使用官方 Docker 文档来设置 docker compose 我现
  • 调用 setValue 时,Extjs ComboBox 未选择正确的值

    我有以下代码 Part of a larger form xtype combo id enroller valueNotFoundText not found triggerAction all mode local fieldLabel
  • 为什么虚拟继承即使不涉及虚函数也需要一个vtable?

    我读过这个问题 C 虚拟类继承对象大小问题 https stackoverflow com questions 57481249 c virtual class inheritance object size issue 并且想知道为什么虚
  • 如何在Vue中重置CSS动画

    我有一个这样的列表 var v new Vue el app data list 1 2 3 4 5 6 7 8 9 10 methods activateClass event event target classList remove
  • Android 应用程序操作不适用于语音命令

    我正在尝试在我的 Android 应用程序中实现应用程序操作和切片 用于实现 我正在使用 应用程序操作测试工具 测试该功能 当我在工具中点击 运行 时 切片会立即加载 但切片无法与语音命令一起使用 是否可以使用语音命令启动切片 我已经在 P
  • 使用属性名称动态访问 Objective-C 属性

    我知道对象属性的字符串名称 我将如何使用字符串获取和设置该属性 虽然 weichsel 是正确的 但还有更好的方法 Use anObject valueForKey propertyName and anObject setValue va
  • webrtc-conferencing-1v3-connectionFactory.dispose()-崩溃

    我正在尝试创建一个 1v3 或 4v4 会议 无论你怎么称呼它 Android 应用程序 我已经使用 webrtc 和 socket io 成功将 4 个人连接在一起 但是当我断开其中一个用户的连接时 我遇到了 webrtc 本机崩溃 Fa
  • 如何优化 mach_msg_trap

    我知道这个问题以前曾被问过 但没有人就如何解决它给出任何有用的答案 我有一个使用 box2d 物理引擎的 cocos2d ios 应用程序 我对其进行了性能测试 CPU 将 5 6 的时间花在 mach msg trap 上 从我从其他问题
  • 在 SQL 中将行转换为列

    Table A ID COLA A value1 B value1 C value1 表B ID DETAIL ID COL X COL Y A 0 foo foo A 1 bar bar B 0 foo foo 我的预期结果是这样的 ID
  • 如何在充气布局内充气具有相同 id 的布局的多个实例

    我有一个带有许多嵌套 LinearLayout 和 TextViews 的 LinearLayout 我的主要活动是主 LinearLayout 的膨胀 然后 我从服务器加载数据 并根据收到的数据 在占位符中添加多个布局 LinearLay
  • 提交后如何保留表单中的字段值?

    提交表单后 字段值似乎被设置回空 我正在做一些表单验证 如果表单无效 我将让它显示错误列表中的错误消息 但我希望保留字段值 有没有办法做到这一点 这是我验证表单的观点 app route booking methods GET POST d
  • 通过提供 sys 路径来使用包

    我发现了这个链接 Python 在本地使用库而不是安装它 https stackoverflow com questions 9059699 python use a library locally instead of installin
  • const_cast VS 可变?有什么区别吗?

    据我了解 mutable取消constness一个变量的 Class A void foo const m a 5 mutable int m a 但是也const cast void print char str cout lt lt s
  • .Net Framework 4.0 安装程序是否包含 .Net Framework 3.5?

    针对 Net Framework 3 5 编译的 Net 组件是否可以在仅安装 Net Framework 4 0 的系统上运行 或者换句话说 Net Framework 4 0 安装程序是否包含 Net Framework 3 5 NET
  • 如何让游戏忽略Unity3D中UI按钮的点击?

    我有一个用户界面Button using UnityEngine UI 然而 点击Button似乎是点击浏览到场景中 在我的例子中单击导航网格 如何解决这个问题呢 我一直在使用典型的 Unity3D 代码来让用户投入游戏 例如 if Inp
  • 将神经网络应用于可变长度语音片段的 MFCC

    我目前正在尝试创建和训练一个神经网络 以使用 MFCC 执行简单的语音分类 目前 我为每个样本使用 26 个系数 总共 5 个不同的类别 这些是具有不同音节数的五个不同单词 虽然每个样本都有 2 秒长 但我不确定如何处理用户可以非常慢或非常
  • Android 自定义 SQLite 构建 - 无法打开数据库

    我的目标是构建一个自定义版本的 SQLite 特别是启用了 R Tree 以包含在我的 Android 项目中 动机源于 Android SQLite R Tree 如何安装模块 https stackoverflow com questi
  • 使用 uwp 应用程序打开任何类型的文件(无需文件关联)

    我正在制作一个简单的 uwp 文本编辑器应用程序 我希望应用程序打开任何类型的文件 即使没有声明文件关联 因为有许多文本文件在操作系统中没有已知的扩展名 有什么方法可以修改注册表 让我的应用程序在 打开方式 列表中可用 例如记事本 以便用户
  • Python 中的快速字符串到整数转换

    实际上 这是一个简单的问题 您有 10 亿 1e 9 个无符号 32 位整数作为十进制 ASCII 字符串存储在 TSV 制表符分隔值 文件中 转换使用int 与处理相同数据集的其他工具相比 速度非常慢 为什么 更重要的是 如何让它更快 因