我正在尝试确保字符串在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
编辑注释:
经过多次测试,我知道这一点:
test4
是最快的。'-'
或'+'
(例如'-123'
),则test2
总是很慢,其他取决于如何删除符号。我仍然不确定。 lstrip('0')
中的test1
仅用于this
答案 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>
我的机器上的结果是:
答案 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