在Python中将字符串转换为整数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (111)

示例数据(将选项卡扩展为空格)

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。

具有IPython 0.9.1的Python 2.6.2,每秒约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(15-Mar-2008),〜523kcps(261%):

正如约翰在评论中指出,该版本并没有建立转换整数列表,所以给出的速比相对于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
提问于
用户回答回答于

我可能会建议,对于原始速度,Python不是适合这个任务的工具。手工编码的C实现将轻松击败Python。

用户回答回答于

以下最简单的C扩展已经在内置的基础上得到了很大的改进,能够以每秒3倍的速度转换字符串(650 kcps对214 kcps):

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);
}

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

扫码关注云+社区

领取腾讯云代金券