我在研究算法,我有一个关于isdigit()my_isdigit()之间的差异的问题.

import time


def my_isdigit(str):
    s = set(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'])
    for x in str:
        if x not in s:
            return False
    return True


test_str = '1234567890' * 10000000
start = time.time()
test_str.isdigit()
print(time.time() - start)  # 0.21125102043151855


start = time.time()
my_isdigit(test_str)
print(time.time() - start)  # 2.169161319732666

为什么isdigit()比我的快得多?

我看到了What is the fastest way to make sure a str is a int?个,但我不知道原因.

这是C和Python之间的区别吗?还是我的代码不好?

推荐答案

诸如str.isdigit()之类的内置函数是用C实现的(当使用CPython时),C比Python快得多.

您可以找到str.isdigit here的C代码;它调用these helpers,在Python的内置Unicode数据库中查找字符类.

由于str是Unicode,并且支持Unicode,这导致了一个可能令人惊讶的结果:不是Latin个数字的字符也是digit个:

>>> '፫'.isdigit()
True

我测试了几种不同的方法(从这个线程和其他线程):甚至比str.isdigit()更快,并且仅限于拉丁数字,就是首先将Unicode字符串编码为ASCII字节,然后在其上运行isdigit(其中is a different implementationuses a simpler lookup table代表256个可能的ASCII字节):

def bytes_isdigit(s):
    return s.encode('ascii', 'ignore').isdigit()

# ...
name='my_isdigit' iters=1 time=2.788 iters_per_sec=0.36
name='builtin' iters=5 time=0.425 iters_per_sec=11.75
name='daweo' iters=1 time=1.011 iters_per_sec=0.99
name='khelwood' iters=1 time=4.837 iters_per_sec=0.21
name='bytes_isdigit' iters=5 time=0.309 iters_per_sec=16.18

Python相关问答推荐

LAB中的增强数组

具有多个选项的计数_匹配

如何在msgraph.GraphServiceClient上进行身份验证?

当多个值具有相同模式时返回空

'discord.ext. commanders.cog没有属性监听器'

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

如何在虚拟Python环境中运行Python程序?

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

优化器的运行顺序影响PyTorch中的预测

如何根据一列的值有条件地 Select 前N组?

如何从需要点击/切换的网页中提取表格?

使用类型提示进行类型转换

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

解决Geopandas和Altair中的正图和投影问题

PySpark:如何最有效地读取不同列位置的多个CSV文件

来自Airflow Connection的额外参数

按条件计算将记录拆分成两条记录

时长超过24小时如何从Excel导入时长数据

为什么在不先将包作为模块导入的情况下相对导入不起作用