确保str是int的最快方法是什么?

时间:2018-09-25 10:50:17

标签: python python-3.x

我正在尝试确保字符串在Python 3.6中为int,这是四种方法。但是我不知道哪个是最快的,还是有人可以给我更快的一个?

import re

input_value = '012345678901'


def test1(value_str):
    value_str = value_str.lstrip('0')
    try:
        value_int = int(value_str)
    except ValueError:
        return False
    return len(str(value_int)) == len(value_str)


def test2(value_str):
    return re.match('\d+$', value_str) is not None


def test3(value_str):
    num_set = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
    for i in value_str:
        if i not in num_set:
            return False
    return True


def test4(value_str):
    return value_str.isdigit()

我用timeit测试了它们,结果如下:

run 1000000 times test1: 0.920672991022002
run 1000000 times test2: 1.1261013330076821
run 1000000 times test3: 0.8881843989947811
run 1000000 times test4: 0.16987622604938224

编辑注释:

经过多次测试,我知道这一点:

  1. 对于无符号数字,test4是最快的。
  2. 对于带符号的数字,如果它包含'-''+'(例如'-123'),则test2总是很慢,其他取决于如何删除符号。我仍然不确定。

lstrip('0')中的test1仅用于this

3 个答案:

答案 0 :(得分:1)

您可以选择以下替代方法:

make[4]: Entering directory '/usr/src/openssl-1.0.2p'
...
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: libcrypto.a(gost_sign.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Makefile.shared:169: recipe for target 'link_a.gnu' failed
make[4]: *** [link_a.gnu] Error 1
make[4]: Leaving directory '/usr/src/openssl-1.0.2p'
Makefile:357: recipe for target 'do_linux-shared' failed
make[3]: *** [do_linux-shared] Error 2
make[3]: Leaving directory '/usr/src/openssl-1.0.2p'
Makefile:310: recipe for target 'libcrypto.so.1.0.0' failed
make[2]: *** [libcrypto.so.1.0.0] Error 2
make[2]: Leaving directory '/usr/src/openssl-1.0.2p'
Makefile:109: recipe for target 'shared' failed
make[1]: *** [shared] Error 2
make[1]: Leaving directory '/usr/src/openssl-1.0.2p/crypto'
Makefile:287: recipe for target 'build_crypto' failed
make: *** [build_crypto] Error 1
tony@linux-31cz:/usr/src/openssl-1.0.2p> 

我的机器上的结果是:

  • test1:0.798348898
  • test2:0.9424690370000001
  • test3:0.5995461930000001
  • test4:0.29526326800000025

答案 1 :(得分:1)

我拿了代码并运行了几次,看来test3是最快的。甚至以为我清理了一点test1,并且能够达到与test3类似的速度,有时甚至更快。在这里,我发布了您的代码,以及我添加的测试:

import re
import timeit


def test1():
    value_str = '-012345678901'
    value_str = value_str.lstrip('0')
    try:
        value_int = int(value_str)
    except ValueError:
        return False
    return bool(len(str(value_int)) == len(value_str))

print(timeit.timeit(test1, number=10000))


def test2():
    value_str = '-012345678901'
    if re.match('[\d]+$', value_str) is not None:
        return True
    else:
        return False

print(timeit.timeit(test2, number=10000))


def test3():
    value_str = '-012345678901'
    num_set = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
    for i in value_str:
        if i not in num_set:
            return False
    return True

print(timeit.timeit(test3, number=10000))


def test4():
    value_str = '-012345678901'
    try:
        int(value_str)
    except ValueError:
        return False
    return True

print(timeit.timeit(test4, number=10000))


def test5():
    value_str = '-012345678901'
    negative = value_str.find("-")
    if negative > 0:
        return False
    elif negative == 0:
        value_str = value_str[1:]
    return value_str.isdigit()

print(timeit.timeit(test5, number=10000))

我也将其与我之前给出的答案进行了比较,我将其功能重命名为test5。事实证明,Test4是更快的选择。

最后,请注意这些功能是独立的。我这样做是为了使timeit成功运行,因为这是一项速度测试,可以选择并恢复这些功能之一,以便再次使用该参数。希望这会有所帮助!

test1 = 0.01150935102486983
test2 = 0.014068655029404908
test3 = 0.006000193010549992
test4 = 0.004028786963317543
test5 = 0.007849656976759434

答案 2 :(得分:0)

最快的方法是使用pythonic方法检查它是否是字母字符串。

import timeit
def test():
    a = "123"
    return a.isalpha()

print(timeit.timeit(test, number=10000))

0.001194985743579478
如果字符串仅包含字母字符,则

isalpha将返回True。 如果字符串包含任何数字或字母数字字符,它将返回False

编辑:

import timeit
def test():
   a = "123"
   a = a.lstrip("-")
   return a.isdigit()

print(timeit.timeit(test, number=10000))

0.0019427791237219235