python - 确保 str 是 int 的最快方法是什么?
问题描述
我试图确保一个字符串在 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')
intest1
就是为了这个
解决方案
嗨,另一种选择可能是以下一种:
def test4(value_str):
negative = value_str.find("-")
if negative > 0:
return False
elif negative == 0:
value_str = value_str[1:]
return value_str.isdigit()
我机器上的结果是:
- 测试1:0.798348898
- 测试2:0.9424690370000001
- 测试3:0.5995461930000001
- 测试4:0.29526326800000025
推荐阅读
- google-tag-manager - 将“读取时间”键添加到数据层以在 Google Tag Manager/Analytics 中进行跟踪
- python - QThreadPool 在 Qt5 中加载 QImage 时导致冻结,而在 Qt4 中非常平滑
- opencv - 使用 OpenCV 查找矩形/梯形(4 个顶点形状)
- excel - VBA用单元格函数中的变量扩展命名表范围错误
- redis - 无法启动/启用redis服务
- openstack - 不同服务器上的 Cinder LVM
- ios - 是否有使用本地化然后用字符串插值补充的好习惯?
- iot - 使用 ChirpStack 服务订阅 IoTAgent-LoRaWAN
- python - 尝试使用 pip 安装 Github 包
- android - 致命异常:主进程:当您按下第二个 ANDROID 错误活动的按钮时